2010-07-26 76 views
2

我有一个CSV文件,其中第一行包含变量名称,其余行包含数据。什么是将它分解成Python中只包含一个变量的文件的好方法?这个解决方案会变得强大吗?例如。如果输入文件大小为100G会怎样?我试图执行分治策略,但是对Python来说是新手。在此先感谢您的帮助!如何将大型CSV数据文件分解为单个数据文件?

输入文件看起来像

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

想要这样做可能会比实现更多的问题 – 2010-07-26 01:16:03

回答

2

由于lomg的列数并不是很荒谬(大于你可以打开的文件数一次在你的平台上),行数和总大小都没有什么大不了的(当然,因为你有足够的磁盘空间;-),因为你一次只能处理一列 - - 我建议以下代码:

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

轻微nitpicks:我想你的意思是w.writerow而不是ouwr.writerow - w是列表中的csvwriter实例:ouwr。另外,嵌套循环“zip(ouwr,r)”应该是“zip(ouwr,row)”,而outfile中的o应该用于outfiles。 另外,它的工作原理。 – bhangm 2010-07-26 01:38:00

+0

我不得不使用一些代码来使它工作。让我测试一个非常大的数据集,然后我会给你你应该得到的分数!谢谢 – xiaodai 2010-07-26 10:13:28

+0

@bhangm,感谢您发现问题 - 编辑修复它们,并+1, - ) – 2010-07-26 19:33:25

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 
+0

awk会比Python更快吗? – xiaodai 2010-07-26 10:16:05

+1

是的。大多数时候。 – ghostdog74 2010-07-26 10:46:57

+0

我是一个完整的noob。 Windows上的awk实现是什么? – xiaodai 2010-07-26 11:29:29

1

如果你的文件是100GB,那么盘IO将是你的瓶颈。考虑使用gzip module来读取(一个预压缩文件)和写入以大幅度加快速度。

+0

谢谢你。有用!我正在做一个SSD,它仍然很慢。有时可能会给gzip一个破解 – xiaodai 2010-07-26 10:18:23

相关问题