处理大尺寸文件时的python问题

2024-06-16 10:09:26 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上,我想为我的日常任务创建一个Python脚本,其中我想比较任意大小的两个文件&希望从两个文件中生成两个新文件,其中包含匹配的记录和不匹配的记录。你知道吗

我已经在下面编写了python脚本&发现它对于文件大小很少的记录来说工作正常。你知道吗

但当我对包含200000和500000条记录的文件执行相同的脚本时,生成的结果文件并没有给出有效的输出。你知道吗

所以,你能检查下面的脚本,并帮助确定问题,在它导致错误的输出。。。?你知道吗

提前谢谢。你知道吗

from sys import argv

script, filePathName1, filePathName2  = argv

def FileDifference(filePathName1, filePathName2):
    fileObject1 = open(filePathName1,'r')
    fileObject2 = open(filePathName2,'r')
    newFilePathName1 = filePathName1 + ' - NonMatchingRecords.txt'
    newFilePathName2 = filePathName1 + ' - MatchingRecords.txt'
    newFileObject1 = open(newFilePathName1,'a')
    newFileObject2 = open(newFilePathName2,'a')
    file1 = fileObject1.readlines()
    file2 = fileObject2.readlines()
    Differece = [ diff for diff in file1 if diff not in file2 ]
    for i in range(0,len(Differece)):
        newFileObject1.write(Differece[i])

    Matching = [ match for match in file1 if match in file2 ]
    for j in range(0,len(Matching)):
        newFileObject2.write(Matching[j])
    fileObject1.close()
    fileObject2.close()
    newFileObject1.close()
    newFileObject2.close()

FileDifference(filePathName1, filePathName2)

编辑1:请注意以上程序执行时没有任何错误。只是输出不正确,程序需要更长的时间来处理大文件。你知道吗


Tags: 文件in脚本forclose记录openfile1
1条回答
网友
1楼 · 发布于 2024-06-16 10:09:26

我将做一个粗略的猜测,并假设“没有有效的输出”意味着:“永远运行,没有做任何有用的”。你知道吗

这是合乎逻辑的,因为你的理解是:

    Differece = [ diff for diff in file1 if diff not in file2 ]
    for i in range(0,len(Differece)):
        newFileObject1.write(Differece[i])

Matching = [ match for match in file1 if match in file2 ]
for i in range(0,len(Matching)):
    newFileObject2.write(Matching[i])

它们执行O(n)查找,这在少量行上是可以的,但是如果len(file1) == 100000file2这样的话,就永远不会结束。然后执行100000*100000次迭代=>;10**10=>;直到永远。你知道吗

修复很简单:创建sets并使用intersection&;difference,速度更快。你知道吗

    file1 = set(fileObject1.readlines())
    file2 = set(fileObject2.readlines())
    difference = file1 - file2
    for i in difference:
        newFileObject1.write(i)

matching = file1 & file2
for i in matching:
    newFileObject2.write(matching)

相关问题 更多 >