使用python将csv拆分为小csv

2024-04-20 13:48:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv(大约750MB大小)。我必须把它分成大小不超过30Mb的小的csv。你知道吗

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)

有没有更好的办法?你知道吗


Tags: 文件csvidfalsedfsizecountermax
2条回答

您可以轻松地将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))

我想你可以用^{}。。。?你知道吗

语法非常简单:

>>> 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分组。每一行都是一个向量,所以在您给出的示例中,它看起来是第二个元素。你知道吗

相关问题 更多 >