40

我想将某些文本行从一个文本文件复制到另一个。在我当前的脚本中,当我搜索一个字符串时,它会复制所有内容,我怎样才能只复制文本的某个部分?例如,仅当其中包含“tests/file/myword”时才复制行?

当前代码:

#!/usr/bin/env python
f = open('list1.txt')
f1 = open('output.txt', 'a')

doIHaveToCopyTheLine=False

for line in f.readlines():

    if 'tests/file/myword' in line:
        doIHaveToCopyTheLine=True

    if doIHaveToCopyTheLine:
        f1.write(line)

f1.close()
f.close()
4

7 回答 7

84

单线:

open("out1.txt", "w").writelines([l for l in open("in.txt").readlines() if "tests/file/myword" in l])

推荐with

with open("in.txt") as f:
    lines = f.readlines()
    lines = [l for l in lines if "ROW" in l]
    with open("out.txt", "w") as f1:
        f1.writelines(lines)

使用更少的内存:

with open("in.txt") as f:
    with open("out.txt", "w") as f1:
        for line in f:
            if "ROW" in line:
                f1.write(line) 
于 2013-03-11T16:40:20.983 回答
9

readlines() 将整个输入文件读入一个列表,表现不佳。只需遍历文件中的行。我在 output.txt 上使用了“with”,以便在完成后自动关闭。'list1.txt' 不需要这样做,因为它会在 for 循环结束时关闭。

#!/usr/bin/env python
with open('output.txt', 'a') as f1:
    for line in open('list1.txt'):
        if 'tests/file/myword' in line:
            f1.write(line)
于 2013-03-11T17:10:52.510 回答
9

只是稍微清理一下这样做的方式。这与 ATOzTOA 的答案差不多,但没有理由做两个单独的 with 语句。

with open(path_1, 'a') as file_1, open(path_2, 'r') as file_2:
    for line in file_2:
        if 'tests/file/myword' in line:
            file_1.write(line)
于 2015-10-06T18:50:51.410 回答
3

安全和节省内存:

with open("out1.txt", "w") as fw, open("in.txt","r") as fr: 
    fw.writelines(l for l in fr if "tests/file/myword" in l)

它不会创建临时列表(做什么readline[]会做什么,如果文件很大,这不是启动器),一切都是通过生成器理解完成的,并且使用with块确保文件在退出时关闭。

于 2017-02-21T20:22:16.847 回答
1
f=open('list1.txt')  
f1=open('output.txt','a')
for x in f.readlines():
    f1.write(x)
f.close()
f1.close()

这将工作 100% 尝试一次

于 2018-09-17T12:42:48.947 回答
1

Python 3.10带括号的上下文管理器中,您可以在一个块中使用多个上下文管理器:

with (open('list1.txt', 'w') as fout, open('output.txt') as fin):
    fout.write(fin.read())
于 2021-06-20T04:29:24.590 回答
-2
f = open('list1.txt')
f1 = open('output.txt', 'a')

# doIHaveToCopyTheLine=False

for line in f.readlines():
    if 'tests/file/myword' in line:
        f1.write(line)

f1.close()
f.close()

现在你的代码可以工作了。试试这个。

于 2015-10-24T19:44:39.363 回答