【发布时间】:2015-12-20 23:26:08
【问题描述】:
我有一个超过 300 GB 的大型 .csv 文件。我想将它分块为每个 100,000,000 行的较小文件(每行大约有 55-60 个字节)。
我写了以下代码:
import pandas as pd
df = pd.read_csv('/path/to/really/big.csv',header=None,chunksize=100000000)
count = 1
for chunk in df:
name = '/output/to/this/directory/file_%s.csv' %s count
chunk.to_csv(name,header=None,index=None)
print(count)
count+=1
这段代码运行良好,我在磁盘上有足够的内存一次存储大约 5.5-6 GB,但它慢。
有没有更好的办法?
编辑
我已经编写了以下迭代解决方案:
with open('/path/to/really/big.csv', 'r') as csvfile:
read_rows = csv.reader(csvfile)
file_count = 1
row_count = 1
f = open('/output/to/this/directory/file_%s.csv' %s count,'w')
for row in read_rows:
f.write(''.join(row))
row_count+=1
if row_count % 100000000 == 0:
f.close()
file_count += 1
f = open('/output/to/this/directory/file_%s.csv' %s count,'w')
编辑 2
我想提请注意 Vor 关于使用 Unix/Linux 拆分命令的评论,这是我找到的最快的解决方案。
【问题讨论】:
-
无需重新发明轮子使用 split linux.die.net/man/1/split 。如果你确实想要它在 python 中,那么将 if 包装在
subprocess模块中。 -
我也一定会试一试的!
-
为什么还要使用 csv 模块?你只是在读和写行。行的输入和输出格式保持不变。另外,
for row in read_rows可以是for row_count, row in enumerate(read_rows, start=1),这样就不需要跟踪行号了。