为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁华开满天机 2021-03-26 11:10:30
如何在Python中将所有偶数行从一个文件复制到新文件?当我希望从一个文件复制到另一个文件时要选择大量的行时,偶数只是一个例证,但作为示例应该很好。我用这个,但是效率很低(大约需要5分钟):# foo.txt holds 200,000 lines with 300 valueslist = [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秒),并且手册也建议这样做。
查看完整描述

3 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

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

keep = {1, 5, 888, 20203}

进而

if i in keep:


查看完整回答
反对 回复 2021-03-30
?
SMILET

TA贡献1796条经验 获得超4个赞

您要花费大量的时间来创建,然后反复搜索(在每一行中!!!)list。只需逐行读取第一个文件,然后跳过其他文件。您可以使用切换标志来执行此操作,也可以只检查行号是否可以被二整(我认为更清晰)。


for i, line in enumerate(file):

    if i % 2 == 0:

        newfile.write(line)

编辑在回答您的编辑:你的问题现在是“如何任意行从文件复制?” 这很大程度上取决于如何定义这些任意行。答案仍然是绝对不要使用“需要的”行号列表,因为搜索该列表会花费很长时间,并且您必须在每一行上进行搜索。


如果目标实质上是要从文件中随机选择行,则可以使用与当前设置类似的方法,但可以使用set代替list来快速查找。一个一般情况下证明了概念的解决方案可能是这样的:


import random


# Pick 5000 random lines

wanted_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')


查看完整回答
反对 回复 2021-03-30
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

我假设您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 = 0

newfile = open(savefile, "w")

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

    for i, line in enumerate(file):

        if i == list[nextidx]:

            newfile.write(line)

            nextidx += 1

newfile.close()


查看完整回答
反对 回复 2021-03-30
  • 3 回答
  • 0 关注
  • 383 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信