【问题标题】:Copying from one text file to another using Python使用 Python 从一个文本文件复制到另一个文本文件
【发布时间】:2013-02-26 22:24:57
【问题描述】:

我想将某些文本行从一个文本文件复制到另一个文本文件。在我当前的脚本中,当我搜索一个字符串时,它会复制所有内容,我怎样才能只复制文本的某个部分?例如。仅在其中包含“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()

【问题讨论】:

  • 您的代码的问题:您必须在循环的每次迭代中重置标志。

标签: python text-files


【解决方案1】:

单线:

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) 

【讨论】:

  • 为我竖起大拇指...此代码在编写之前创建了第二个列表。它不可扩展。不应使用 readlines() 和创建第二个列表的列表推导。
  • @ATOzTOA,这些代码会关闭文件吗?特别是在第一个代码中,我不知道如何引用文件来关闭!
  • @ZeinabAbbasi 该文件将自动关闭,除非出现异常。使用with,即使有异常也会关闭文件。
  • @ATOzTOA 嗨,什么是“行”。如果我们用row去掉if条件,直接写文件呢?
【解决方案2】:

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)

【讨论】:

    【解决方案3】:

    只是一种稍微清理一下的方法。这并不比 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)
    

    【讨论】:

      【解决方案4】:

      安全且节省内存:

      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 块确保文件在退出时关闭。

      【讨论】:

        【解决方案5】:
        f=open('list1.txt')  
        f1=open('output.txt','a')
        for x in f.readlines():
            f1.write(x)
        f.close()
        f1.close()
        

        这将工作 100% 尝试一次

        【讨论】:

          【解决方案6】:

          在带有括号的上下文管理器Python 3.10 中,您可以将多个上下文管理器合二为一地使用:

          with (open('list1.txt', 'w') as fout, open('output.txt') as fin):
              fout.write(fin.read())
          

          【讨论】:

            【解决方案7】:
            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()
            

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-04-14
              • 1970-01-01
              • 1970-01-01
              • 2020-01-22
              • 2013-04-23
              相关资源
              最近更新 更多