首頁 > 軟體

如何將一個CSV格式的檔案分割成兩個CSV檔案

2022-07-31 18:01:38

將一個CSV格式的檔案分割成兩個CSV檔案

本專案可以按照比例將一個csv檔案分割成兩個csv檔案,效果是:在C:algo_file資料夾下,將該資料夾下的data.csv檔案分成train.csv和vali.csv

完整程式碼:

定義split_csv函數

import csv
import os
def split_csv(path, total_len, per):
    # 如果train.csv和vali.csv存在就刪除
    if os.path.exists('C:\algo_file\train.csv'):
        os.remove('C:\algo_file\train.csv')
    if os.path.exists('C:\algo_file\vali.csv'):
        os.remove('C:\algo_file\vali.csv')
    with open(path, 'r', newline='') as file:
        csvreader = csv.reader(file)
        i = 0
        for row in csvreader:
            if i < round(total_len * per/100):
                # train.csv存放路徑
                csv_path = os.path.join("C:\algo_file", 'train.csv')
                print(csv_path)
                # 不存在此檔案的時候,就建立
                if not os.path.exists(csv_path):
                    with open(csv_path, 'w', newline='') as file:
                        csvwriter = csv.writer(file)
                        csvwriter.writerow(row)
                    i += 1
                # 存在的時候就往裡面新增
                else:
                    with open(csv_path, 'a', newline='') as file:
                        csvwriter = csv.writer(file)
                        csvwriter.writerow(row)
                    i += 1
            elif (i >= round(total_len * per/100)) and (i < total_len):
            	# vali.csv存放路徑
                csv_path = os.path.join("C:\algo_file", 'vali.csv')
                print(csv_path)
                # 不存在此檔案的時候,就建立
                if not os.path.exists(csv_path):
                    with open(csv_path, 'w', newline='') as file:
                        csvwriter = csv.writer(file)
                        csvwriter.writerow(row)
                    i += 1
                # 存在的時候就往裡面新增
                else:
                    with open(csv_path, 'a', newline='') as file:
                        csvwriter = csv.writer(file)
                        csvwriter.writerow(row)
                    i += 1
            else:
                break
    print("訓練集和驗證集分離成功")
    return

呼叫上述函數

if __name__ == '__main__':
    path = 'C:\algo_file\data.csv'
    total_len = len(open(path, 'r').readlines())# csv檔案行數
    per = 80 # 分割比例%
    split_csv(path, total_len, per)

按照訓練集佔80%(驗證集20%)比例,對C:algo_file資料夾下的data.csv進行分割,在該檔案下得到train.csv 和 vali.csv。

最後

本專案只是以C:algo_file資料夾為例,實際上data.csv所在路徑,train.csv所在路徑,vali.csv所在路徑包括檔名都可以更改。 

將CSV檔案以某列為條件分類切割

專案中有一個資料檔案數量龐大,一個檔案中按照年月日分成幾十萬條資料,想試試能不能用python把它簡單切割一下,按照日期分類切成小的csv檔案。

於是在網上找了很多資料,結合自己的一些修改,整理了一下,方便以後再用。

大概步驟

1、讀取檔案

2、找出需要分類的列

3、將此列中重複的內容刪除,每類剩餘一條

4、把該列所有符合某一類的內容存入一個csv檔案中

上程式碼 

import pandas as pd
# 讀取檔案資料
df=pd.read_csv('D:\接收的檔案\lqf.csv', sep=',',engine='python',header=[0])
# 列csv檔案中所有列
df.columns = ['year', 'date', 'statefips', 'countyfips', 'ctfips', 'latitude', 'longitude', 'DS_PM_pred', 'DS_PM_stdd']
#  刪除date列中的重複項,也就是說剩下的date都是已經分好的類別
date_cate = df.drop_duplicates(subset=['date'])
print(date_cate.date)
print(range(len(date_cate)))    # date中的所有類,也就是檔案數
for name in date_cate.date:
    print(name)
    # 當date為某一個類時,存入一個小的csv檔案中,檔名為類名
    df[df.date == name].to_csv("D:\接收的檔案\data\"+u"%s" %name+".csv") 

header=[0] #代表第一行為表頭不計入其中,可根據表格修改。

!!!!!!(2)!!!!!!遍歷資料夾中所有的檔案然後進行切割,沒啥用,自己做個存檔而已 ↓↓↓↓↓ 

import pandas as pd
import os
j = 347
for info in os.listdir('D:\接收的檔案year_02'):
    domain = os.path.abspath(r'D:\接收的檔案year_02') # 獲取資料夾的路徑
    info = os.path.join(domain, info) # 將路徑與檔名結合起來就是每個檔案的完整路徑
    # 讀取檔案資料
    df = pd.read_csv(info, sep=',', engine='python', header=[0])
    # 列csv檔案中所有列
    df.columns = ['year', 'date', 'statefips', 'countyfips', 'ctfips', 'latitude', 'longitude', 'DS_PM_pred', 'DS_PM_stdd']
    grouped = df.groupby('date')
    # delete duplicated data
    ind_frame = df.drop_duplicates(subset=['date'])
    # print(ind_frame.date)
    # print(range(len(ind_frame)))
    for name in ind_frame.date:
        # print(name)
        j += 1
        print("已經掃描到第" + '{}'.format(j)+'個檔案')
        df[df.date == name].to_csv("D:\接收的檔案\data2\" + u"%s" %name+".csv")

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com