猿问

有效地将特定行复制到另一个文件(Python 3.3)

如何在Python中将所有偶数行从一个文件复制到新文件?


当我希望从一个文件复制到另一个文件时要选择大量的行时,偶数只是一个例证,但作为示例应该很好。


我用这个,但是效率很低(大约需要5分钟):


# foo.txt holds 200,000 lines with 300 values

list = [0, 2, 4, 6, 8, 10..... 199996, 199998]

newfile = open(savefile, "w")

with open("foo.txt", "r") as file:

    for i, line in enumerate(file):

        if i in list:

            newfile.write(line)

newfile.close()

如果有一个解释为什么它这么慢,我也将不胜感激:逐行阅读很快(大约15秒),并且手册也建议这样做。


繁华开满天机
浏览 384回答 3
3回答

摇曳的蔷薇

一直在寻找东西list。为了弄清楚是否i在中list,它必须扫描整个列表以确保它不存在。如果您确实只关心偶数,则可以简单地使用if i % 2 == 0,但是如果您要使用一组特定的行号,则应该使用set具有O(1)成员资格测试的,例如keep = {1, 5, 888, 20203}进而if i in keep:

SMILET

您要花费大量的时间来创建,然后反复搜索(在每一行中!!!)list。只需逐行读取第一个文件,然后跳过其他文件。您可以使用切换标志来执行此操作,也可以只检查行号是否可以被二整(我认为更清晰)。for i, line in enumerate(file):    if i % 2 == 0:        newfile.write(line)编辑在回答您的编辑:你的问题现在是“如何任意行从文件复制?” 这很大程度上取决于如何定义这些任意行。答案仍然是绝对不要使用“需要的”行号列表,因为搜索该列表会花费很长时间,并且您必须在每一行上进行搜索。如果目标实质上是要从文件中随机选择行,则可以使用与当前设置类似的方法,但可以使用set代替list来快速查找。一个一般情况下证明了概念的解决方案可能是这样的:import random# Pick 5000 random lineswanted_lines = set(random.sample(range(200000), 5000)) # Use a set!for i, line in enumerate(file):    if i in wanted_lines: # average-case O(1)        newfile.write(str(line)+'\n')

陪伴而非守候

我假设您list是预定义的,并且可以包含任何可能的行索引序列,例如不一定是第N行。第一个可能的瓶颈是您要进行O(n)列表搜索(i in list)200000次。将列表转换为字典应该已经有所帮助:listd = dict.fromkeys(list)..   # this is O(1) instead of O(n)   if i in listd:或者,如果您知道list已排序,或者可以对其进行排序,只需跟踪下一行索引:list = [0, 2, 4, 6, 8, 10..... 199996, 199998]nextidx = 0newfile = open(savefile, "w")with open("foo.txt", "r") as file:    for i, line in enumerate(file):        if i == list[nextidx]:            newfile.write(line)            nextidx += 1newfile.close()
随时随地看视频慕课网APP

相关分类

Python
我要回答