如何使用 Python 内置函数成功处理大量 .txt 文件?

Posted

技术标签:

【中文标题】如何使用 Python 内置函数成功处理大量 .txt 文件?【英文标题】:What can I do using Python built-ins to successfully process a massive .txt file? 【发布时间】:2019-01-11 14:22:57 【问题描述】:

我有一个项目,我需要从一个相对较大的 .txt 文件中读取数据,该文件包含 5 列和大约 2500 万行逗号分隔数据,处理数据,然后将处理后的数据写入新的 .txt 文件。 txt 文件。当我尝试处理这么大的文件时,我的电脑死机了。

我已经编写了处理数据的函数,它适用于小的输入 .txt 文件,所以我只需要调整它以适用于较大的文件。

这是我的代码的删减版:

import csv
import sys

def process_data(input_file, output_file):

    prod_dict = 
    with open(input_file, "r") as file:

        # some code that reads all data from input file into dictionary


    # some code that sorts dictionary into an array with desired row order

    # list comprehension code that puts array into desired output form

    with open(output_file, 'w') as myfile:
        wr = csv.writer(myfile)
        for i in final_array:
            wr.writerow(i)

def main():
    input_file = sys.argv[1]
    output_file = sys.argv[2]
    process_data(input_file, output_file)

if __name__ == '__main__':
    main()

【问题讨论】:

大文件有什么问题? 当我尝试处理较大的文件时,我的电脑死机了。 您需要一次读取所有文件,还是分块读取和处理? 重要的是要知道为什么需要将整个文件读入内存才能在此处提供答案。你对读取的数据执行了哪些操作? @sundance 我不需要一次读取所有文件——我可以分块读取它,但我不知道该怎么做。 【参考方案1】:

该文件显然太大,无法一次将整个内容读入内存。听起来您需要分块处理文件。

有许多排序算法,包括一些不需要一次将整个文件读入内存的算法。特别是,请查看“合并排序”的概念。 wikipedia article 中有一个很好的技术动画演示了这个概念。您可以进行合并排序,而无需一次在内存中对两个以上的项目进行排序。基本上就是“分而治之”。

一般程序:

    选择一些您可以在记忆中轻松处理的项目。 (可能是 10000,也可能是 100000,但它的大小可以随心所欲。我假设为 10000。) 迭代地从源文件中提取项目,当您读取了那么多行时停止(但保持文件处于打开状态并保持其当前文件指针到位)。您可以使用文件对象的readline 方法(还有其他方法可以使用文件的内置生成器函数,但readline 工作正常)。 对这 10000 行进行排序(并执行您可能需要执行的任何其他转换)并将结果列表写入临时文件。 (您需要为每个临时文件生成一个唯一名称,以便以后找到它。假设第一个临时文件名为“temp0”) 再读取 10000 行并对它们进行排序,将结果存储到另一个临时文件(“temp1”)中。 起泡、冲洗、重复,直到将原始输入文件分成 2500 个排序临时文件:[temp0, temp1, temp2, ... temp2499] 现在您只需开始合并文件对,在进行时保持它们的排序。首先将(temp0 和 temp1)合并到一个新的临时文件(temp_0_1)中。然后将 (temp2 和 temp3) 合并到 (temp_2_3) 中。依此类推,直到您将(temp2498 和 temp2499)合并到(temp_2498_2499)中。 (您可以随时删除第一组临时文件。) 现在再次合并文件对,这次您将 (temp_0_1 与 temp_2_3) 合并为 (temp_0_1_2_3),并将 (temp_4_5 与 temp_6_7) 合并为 (temp_4_5_6_7)。依此类推,直到 (temp_2496_2497_2498_2499)。 继续迭代合并文件对。在每个步骤中,您剩下的文件数量都会分成两份。 (尽管文件大小平均翻了一番)。最终,将只有一个文件进行排序。 对于上面的每个合并,您永远不需要在内存中保存多个要合并的两个文件中的一行。由于您开始使用的文件已经排序,因此每个文件的第一行是排序键最低的文件,因此您可以简单地将文件 A 中的最低值与文件 B 中的最低值进行比较。最低的被写入输出,然后被相应文件中的下一条记录替换。

【讨论】:

【参考方案2】:

你需要逐行处理,听起来像。

(不是整个文件加载到内存中。)

for line in open('really_big_file.dat'): process_data(line)

解释:https://***.com/a/519653/9914705

【讨论】:

如何逐行处理? for line in open('file.txt'): process_line(line) ***.com/questions/519633/… 这似乎如你所愿。 for line in open('really_big_file.dat'): process_data(line)

以上是关于如何使用 Python 内置函数成功处理大量 .txt 文件?的主要内容,如果未能解决你的问题,请参考以下文章

Python 集合内置函数大全(非常全!)

python16_day03集合函数递归内置函数

python内置函数zip

Python Expert:如何继承内置类并覆盖每个成员函数 w.r.t.基类成员函数?

Python内置的字符串处理函数整理

如何使用 Python Ray 在不耗尽内存的情况下并行处理大量数据?