我有一个csv
(大约750MB的大小(。我必须将其分成小csv
每个大小不超过30Mb。
c1,c2,c3,c4
1,a,1,4
2,a,1,4
3,b,1,4
4,b,1,4
5,b,1,4
6,c,1,4
约束是不能在不同的文件中具有相同的c2
。 (例如,一个文件中不能有一半b
,另一个文件中不能有另一半( 如果C2
本身的一个值超过 30Mb,则将与该c2
关联的数据打印到文件中
我用熊猫做同样的事情;我的代码
max_size = 30 * 1000000
df = pd.read_csv("data.csv", low_memory=False)
unique_ac_id = pd.unique(df.C2)
counter = 1
df_arr = []
total_size = 0
for ac_id in unique_ac_id:
df_cur = df[df.C2 == ac_id]
size = df_cur.memory_usage(index=False, deep=True).sum()
if size > max_size:
print(f'{ac_id} size is more than max size allowded')
if total_size > max_size:
pd.concat(df_arr).to_csv(f'out/splitter_{counter}.csv', index=False)
counter += 1
df_arr.clear()
total_size = 0
df_arr.append(df_cur)
total_size += size
if len(df_arr) > 0:
pd.concat(df_arr).to_csv(f'out/splitter_{counter}.csv', index=False)
有没有更好的方法来做同样的事情?
您可以轻松地将该 CSV 拆分为大小相等的块。
import pandas as pd
for i,chunk in enumerate(pd.read_csv('C:/your_path_here/main.csv', chunksize=100)):
chunk.to_csv('chunk{}.csv'.format(i))
我想你可以使用csv
...?
语法非常简单:
>>> import csv
>>> with open('eggs.csv', 'rb') as csvfile:
... spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
... for row in spamreader:
... print ', '.join(row)
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam
使用这种方法,我一次只读取 30MB,然后将读取内容假脱机到另一个 csv。 假设您有row
中的矢量内容,您将能够确定每行的大小,并确定 ~30MB 的行数,所以希望这能帮助您入门。
此外,考虑到关于c2
的约束,您最终可能会打开多个 csv,以便每个 csv 都包含其各自的c2
分组。每一行都是一个向量,所以在你给出的示例中,这似乎是第二个元素。