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

3
我有一个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

2
想做到那一点很可能比实现本身更具问题性。 - John Machin
6个回答

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()

3
小问题:我想您应该是指 w.writerow 而不是 ouwr.writerow,其中 w 是 list: ouwr 中的 csvwriter 实例。此外,嵌套循环“zip(ouwr, r)”应为“zip(ouwr, row)”,而“o in outfile”应为“o in outfiles”。另外,它有效。 - bhangm
我必须对代码进行一些调整才能使其正常工作。让我在一个非常大的数据集上测试它,然后我会给你应得的赞!谢谢。 - xiaodai
@bhangm,感谢您发现这些问题 - 我会进行编辑以修复它们,并且点赞!-) - Alex Martelli

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

awk比Python更快吗? - xiaodai
我是一个完全的新手。在Windows上有什么好的awk实现? - xiaodai
1
前往 gnuwin32.sourceforge.net/packages.html。查找 gawk。还有其他*nix工具,特别是coreutils。 - ghostdog74

1

打开n个输出文件,一个输入文件,并逐行阅读。将每行分割并将n个部分写入每个文件。每次只在内存中存储一行(我假设这一行不是100GB?)


1
如果你的文件大小为100GB,那么磁盘IO将成为瓶颈。考虑使用gzip模块进行读取(预压缩文件)和写入以大幅提高速度。

谢谢。很有用!我正在将它放到SSD上,但速度仍然很慢。也许有时候可以尝试使用gzip。 - xiaodai

0

0
使用chunksize获取数据块,然后将该块随机写入不同的文件。
df_reader = pd.read_csv("large_file.csv", chunksize=10)

mychunk=next(df_reader)

or

for chunk in pd.read_csv('large_file.csv', chunksize=10):

   #random choice a file to write to

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接