如何将大CSV数据文件拆分为单独的数据文件?

3 投票
6 回答
862 浏览
提问于 2025-04-16 01:49

我有一个CSV文件,第一行是变量的名字,后面的行是数据。有没有什么好的方法可以把它拆分成多个文件,每个文件只包含一个变量,使用Python来实现?这个方法能否应对大文件的情况?比如说,如果输入文件有100G那么大呢?我想用分而治之的策略,但对Python还不太熟悉。提前谢谢你的帮助!

输入文件的样子是这样的:

var1,var2,var3
1,2,hello
2,5,yay
...

我想创建3个(或者更多)文件,分别是var1.csv、var2.csv、var3.csv,文件的内容应该像这样:

文件1
var1
1
2
...

文件2

var2
2
5
...

文件3

var3
hello
yay

6 个回答

1

打开n个输出文件,和一个输入文件,然后一行一行地读取输入文件的内容。把每一行切分成n个部分,然后把这些部分写入到每个输出文件中。你每次只在内存中保存一行内容,(我想这行内容不会有100GB吧?)

1

如果Python不是必须的,

awk -F"," 'NR==1{for(i=1;i<=NF;i++)a[i]=$i}NR>1{for(i=1;i<=NF;i++){print $i>a[i]".txt"}}' file
2

只要列的数量不是特别多(比如超过你在平台上能同时打开的文件数量),行的数量和总大小就没什么大问题(当然前提是你的磁盘上有足够的空闲空间;-) 因为你每次只处理一列 -- 我建议使用以下代码:

import csv

def splitit(inputfilename):
  with open(inputfilename, 'rb') as inf:
    inrd = csv.reader(inf)
    names = next(inrd)
    outfiles = [open(n+'.csv', 'wb') for n in names]
    ouwr = [csv.writer(w) for w in outfiles]
    for w, n in zip(ouwr, names):
      w.writerow([n])
    for row in inrd:
      for w, r in zip(ouwr, row):
        ouwr.writerow([r])
    for o in outfiles: o.close()

撰写回答