如何在Python中拆分大文件csv文件(7GB)
我有一个7GB如何在Python中拆分大文件csv文件(7GB),python,csv,split,Python,Csv,Split,我有一个7GBcsv文件,我想把它分成更小的块,这样在笔记本上用Python进行分析时,它可读性更强,速度更快。我想从中获取一个小集合,可能是250MB,那么我如何才能做到这一点呢?请参阅文件中的对象(由打开(文件名)返回的对象)-您可以选择读取指定数量的字节,或者使用读取行一次处理一行。您不需要Python来拆分csv文件。使用shell: $ split -l 100 data.csv 将data.csv拆分为100行的块。可能是这样的吗 #!/usr/local/cpython-3.3/
csv
文件,我想把它分成更小的块,这样在笔记本上用Python进行分析时,它可读性更强,速度更快。我想从中获取一个小集合,可能是250MB,那么我如何才能做到这一点呢?请参阅文件中的对象(由打开(文件名)返回的对象)
-您可以选择读取指定数量的字节,或者使用读取行
一次处理一行。您不需要Python来拆分csv文件。使用shell:
$ split -l 100 data.csv
将data.csv
拆分为100行的块。可能是这样的吗
#!/usr/local/cpython-3.3/bin/python
import csv
divisor = 10
outfileno = 1
outfile = None
with open('big.csv', 'r') as infile:
for index, row in enumerate(csv.reader(infile)):
if index % divisor == 0:
if outfile is not None:
outfile.close()
outfilename = 'big-{}.csv'.format(outfileno)
outfile = open(outfilename, 'w')
outfileno += 1
writer = csv.writer(outfile)
writer.writerow(row)
我必须做一个类似的任务,并使用熊猫包:
for i,chunk in enumerate(pd.read_csv('bigfile.csv', chunksize=500000)):
chunk.to_csv('chunk{}.csv'.format(i), index=False)
我同意@jornsharpe readline应该能够一次读取一行,即使是大文件
如果您处理的是大型csv文件,我建议您使用。我经常出于同样的目的使用它,而且总是觉得它很棒(而且速度很快)。需要一点时间来习惯数据帧的概念。但一旦您克服了这一点,它会大大加快像您这样的大型操作
希望有帮助。这里有一个小python脚本,我用来将一个文件data.csv
拆分为几个csv部分文件。部分文件的数量可以通过chunk\u size
控制(每个部分文件的行数)
原始文件的标题行(列名)将复制到每个零件CSV文件中
它适用于大文件,因为它使用readline()
一次读取一行,而不是一次将整个文件加载到内存中
#!/usr/bin/env python3
def main():
chunk_size = 9998 # lines
def write_chunk(part, lines):
with open('data_part_'+ str(part) +'.csv', 'w') as f_out:
f_out.write(header)
f_out.writelines(lines)
with open('data.csv', 'r') as f:
count = 0
header = f.readline()
lines = []
for line in f:
count += 1
lines.append(line)
if count % chunk_size == 0:
write_chunk(count // chunk_size, lines)
lines = []
# write remainder
if len(lines) > 0:
write_chunk((count // chunk_size) + 1, lines)
if __name__ == '__main__':
main()
注意:这不会使每个文件的标题保持不变。只是为了防止您需要每个区块的标题字段。对于csv文件,这不是傻瓜式的。如果长文本引号转义值中有换行符,则行可能会在两个文件之间拆分。最后一个参数可以添加到前缀文件中,并使用有用的名称split-l 100 data.csv data\u split\uu
我认为这个解决方案不好。我有一个2GB(16m行),pandas无法在内存中处理它。分块并不意味着不将整个df加载到内存(RAM)中,这只是意味着您可以使用chunksize
中指定的行数立即阅读。这是一个很好的答案。但请注意,这会向原始csv添加一个额外的索引列。“这会向原始csv添加一个额外的索引列。”-现在通过添加Index=False解决了这一问题。这确实会分割CSV,但输出CSV中的每一行之间都有空行。熊猫实际上是处理大型CSV文件的一个非常糟糕的解决方案,因为它们只能一次真正处理可存储在RAM中的数据。建议使用其他库,如Dask。这答案并不能解释它为什么起作用,人们如何从中学习?