【问题标题】:Speed up python split process加快python拆分过程
【发布时间】:2023-01-25 23:12:09
【问题描述】:

我有一个非常大的 4+ GB 大小的文本文件,我有一个脚本根据第一个逗号之前的字符将文件分成小文件。例如:16,.... 行转到 16.csv,61,.... 行转到 61.csv。不幸的是,这个脚本运行了很长时间,我猜是因为写出方法。有什么办法可以加快脚本的速度吗?

import pandas as pd
import csv


with open (r"updates//merged_lst.csv",encoding="utf8", errors='ignore') as f:
    r = f.readlines()

for i in range(len(r)):
    row = r[i]
    letter = r[i].split(',')[0]
    filename = r"import//"+letter.upper()+".csv"
    with open(filename,'a',encoding="utf8", errors='ignore') as f:
        f.write(row) 

【问题讨论】:

  • 我明白这一点,但我该怎么做呢?我希望写出大约几十个 csv。如何在不打开的情况下将新行添加到特定的 csv?
  • 大文件中有多少行?
  • letters 在所有行中都是唯一的吗?
  • 17个不同的数字和5800万行

标签: python csv split


【解决方案1】:

我不确定这是否真的有很大的不同,或者瓶颈是否在其他地方,但我不会为输入中的每一行打开和关闭输出文件,而是打开每个输出文件一次并重新使用它。

为了同时打开多个文件并使用正确的文件进行写入,我会将它们放入字典中,使用 letter 作为键:

files = {}

for i in range(len(r)):
    row = r[i]
    letter = r[i].split(',')[0]
    if letter not in files:
        filename = r"import//"+letter.upper()+".csv"
        files[letter] = open(filename,'a',encoding="utf8", errors='ignore')
    f = files[letter]
    f.write(row)

(除了检查 if letter not in files,您还可以使用 files.setdefault。)

这样做的缺点是您不能使用 with 块来自动关闭文件。您必须在最后手动关闭它们以确保内容已写入磁盘。

for f in files.values():
    f.close()

【讨论】:

  • 我同意这个答案,但我确实想知道一次读取一行、处理它并编写它是否会以任何方式加快速度。
  • 我还要补充一点,最好是逐行读取输入文件并立即处理它,而不是 r = f.readlines()
  • @Axe319 这在内存方面会更好,但不会使脚本更快。
  • 我同意,但如果你已经有 4 GB 的文本文件,它很可能会在未来增长。另外,我没有看到任何益处这样做。
【解决方案2】:

读取文件的各个部分并使用to_csv 将加快此脚本的速度。此示例一次读取大文件 500,000 行。

import pandas as pd
    
r = pd.read_csv(r"updates//merged_lst.csv", chunksize=500000, encoding="utf8", errors='ignore')

for chunk in r:
    for index, row in chunk.iterrows():
        letter = row[0].split(',')[0]
        f = r"import//"+letter.upper()+".csv"
        chunk.loc[index:index].to_csv(f, mode='a', header=False, index=False)

【讨论】:

    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    相关资源
    最近更新 更多