当前位置: 代码迷 >> python >> 如何将大型CSV数据文件拆分为单个数据文件?
  详细解决方案

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

热度:108   发布时间:2023-06-16 10:05:36.0

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

尽管列数并不庞大(比您可以在平台上一次打开的文件数大),但行数和总大小并不重要(当然,很长的时间)因为您的磁盘上有足够的可用空间;-)因为您一次只处理一列-我建议使用以下代码:

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

打开n个输出文件,一个输入文件并一次读取一行。 切成一行,然后将n个片段写入每个文件。 您每次只在内存中存储一??行,(我想这行不是100GB吗?)

如果不是必须使用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

如果文件为100GB,则光盘IO将成为瓶颈。 考虑将用于读取(预压缩文件)和写入两者,以大幅度提高速度。

尝试这个:

crunch input.csv output.csv "SELECT AVG(duration) AS durAvg FROM (SELECT * FROM indata ORDER BY duration LIMIT 2 OFFSET 6)"