使用Python内置程序来成功处理大量的.txt文件,我能做些什么?
我有一个项目,需要从一个相对较大的.txt文件中读取数据,该文件包含5列和大约2500万行逗号分隔的数据,处理数据,然后将处理后的数据写入一个新的.txt文件。当我试图处理这么大的文件时,我的电脑会死机 我已经编写了处理数据的函数,它可以处理较小的input.txt文件,所以我只需要调整它以处理较大的文件 以下是我的代码的节略版本:使用Python内置程序来成功处理大量的.txt文件,我能做些什么?,python,dictionary,multiprocessing,chunks,Python,Dictionary,Multiprocessing,Chunks,我有一个项目,需要从一个相对较大的.txt文件中读取数据,该文件包含5列和大约2500万行逗号分隔的数据,处理数据,然后将处理后的数据写入一个新的.txt文件。当我试图处理这么大的文件时,我的电脑会死机 我已经编写了处理数据的函数,它可以处理较小的input.txt文件,所以我只需要调整它以处理较大的文件 以下是我的代码的节略版本: import csv import sys def process_data(input_file, output_file): prod_dict =
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()
你需要一行一行地处理它,听起来像 不是将整个文件加载到内存中 对于打开的'really_big_file.dat'中的行: 进程数据线
如前所述:文件显然太大,无法一次性将整个内容读入内存。听起来您需要分块处理文件 有许多排序算法,包括一些不需要一次性将整个文件读入内存的算法。特别是,请研究合并排序的概念。有一个很好的动画技术在演示的概念。您可以进行合并排序,而不必同时在内存中对两个以上的项进行排序。基本上就是分而治之 一般程序: 选择一些你可以在记忆中轻松处理的项目。可能是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中的最低值。最低值写入输出,然后替换为相应文件中的下一条记录。
较大的文件有什么问题?当我试图处理较大的文件时,我的计算机会冻结。您需要一次读取所有文件,还是可以分块读取和处理?了解为什么需要将整个文件读取到内存中才能在此处提供答案是很重要的。您对读取的数据执行什么操作?@sundance我不需要一次读取所有文件-我可以分块读取,但我不知道如何执行。如何逐行处理它?对于打开的“file.txt”中的行:process\u lineline这似乎是您希望的。对于打开的'really\u big\u file.dat'中的行:process\u dataline