【问题标题】:How to break a large CSV data file into individual data files?如何将大型 CSV 数据文件拆分为单独的数据文件?
【发布时间】:2010-07-26 00:38:41
【问题描述】:

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

【问题讨论】:

  • 想要这样做可能比实施更成问题

标签: python csv


【解决方案1】:

虽然列数不是很大(大于您可以在平台上一次打开的文件数),但行数和总大小也没什么大不了的(因为当然,因为您在磁盘上有足够的可用空间;-) 因为您一次只处理一列——我建议使用以下代码:

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

【讨论】:

  • 次要挑剔:我想你的意思是 w.writerow 而不是 ouwr.writerow - w 是列表中的 csvwriter 实例:ouwr。此外,嵌套循环“zip(ouwr, r)”应该是“zip(ouwr, row)”并且 for o in outfile - 应该是 for o in outfiles。此外,它还有效。
  • 我不得不稍微修改一下代码才能让它工作。让我在一个非常大的数据集上测试它,然后我会给你你应得的打勾!谢谢
  • @bhangm,感谢您发现问题 - 将进行编辑以修复它们,+1!-)
【解决方案2】:

打开 n 个输出文件,一个输入文件,一次读取一行。将行切碎并将 n 块写入每个文件。您每次只在内存中存储一​​行,(我假设该行不是 100GB?)

【讨论】:

    【解决方案3】:

    如果 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 快吗?
    • 我是个十足的菜鸟。 Windows 上有什么好的 awk 实现?
    • 去这里:gnuwin32.sourceforge.net/packages.html。寻找傻瓜。还有其他 *nix 工具,尤其是 coreutils。
    【解决方案4】:

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

    【讨论】:

    • 谢谢。有用!我正在对 SSD 执行此操作,但它仍然很慢。可能会在某个时候给 gzip 一个破解
    【解决方案5】:

    试试这个:

    http://ondra.zizka.cz/stranky/programovani/ruzne/querying-transforming-csv-using-sql.texy

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

    【讨论】:

      【解决方案6】:

      使用 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
      

      【讨论】:

        猜你喜欢
        • 2018-02-17
        • 2011-03-23
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 2019-06-14
        • 1970-01-01
        • 2023-04-09
        相关资源
        最近更新 更多