【问题标题】:Remove and insert lines in a text file在文本文件中删除和插入行
【发布时间】:2010-02-21 15:29:05
【问题描述】:

我有一个文本文件看起来像:

第一行 第二行 第三行 第四行 第五行 第六行

我想用三个新行替换第三行和第四行。上面的内容会变成:

第一行 第二行 新线1 新线2 新线3 第五行 第六行

如何使用 Python 做到这一点?

【问题讨论】:

    标签: python file-io


    【解决方案1】:

    对于python2.6

    with open("file1") as infile:
        with open("file2","w") as outfile:
            for i,line in enumerate(infile):
                if i==2:
                    # 3rd line
                    outfile.write("new line1\n")
                    outfile.write("new line2\n")
                    outfile.write("new line3\n")
                elif i==3:
                    # 4th line
                    pass
                else:
                    outfile.write(line)
    

    对于python3.1

    with open("file1") as infile, open("file2","w") as outfile:
        for i,line in enumerate(infile):
            if i==2:
                # 3rd line
                outfile.write("new line1\n")
                outfile.write("new line2\n")
                outfile.write("new line3\n")
            elif i==3:
                # 4th line
                pass
            else:
                outfile.write(line)
    

    【讨论】:

      【解决方案2】:
      import fileinput
      myinsert="""new line1\nnew line2\nnew line3"""
      for line in fileinput.input("file",inplace=1):
          linenum=fileinput.lineno()
          if linenum==1 or linenum>4 : 
              line=line.rstrip()
          if linenum==2:
              line=line+myinsert
          print line
      

      或者如果你的文件不是太大,

      import os
      myinsert=["new line3\n","new line2\n","new line1\n"]
      data=open("file").readlines()
      data[2:4]=""
      for i in myinsert:data.insert(2,i)
      open("outfile","w").write(''.join(data))
      os.rename("outfile","file)
      

      【讨论】:

        【解决方案3】:

        将整个文件作为行列表读取,然后将要删除的行替换为新的行列表:

        f = open('file.txt')
        data = f.readlines()
        f.close()
        data[2:4] = [
            'new line1\n',
            'new line2\n',
            'new line3\n']
        f = open('processed.txt','w')
        f.writelines(data)
        f.close()
        

        请注意,列表切片是从零开始的,[2:4] 表示“元素 2 到但不包括元素 4”。

        【讨论】:

          【解决方案4】:

          打开要写入的第二个文件,读取然后写入要复制的行,写入新行,读取要跳过的行,然后复制其余行。

          【讨论】:

          • 这是理想的,因为(与其他几个建议不同)它不需要将整个文件(未指定大小)读入内存。
          • @Charles Duffy,Mark Tolonen 的解决方案是我在这里看到的唯一一次将 while 文件读入内存的解决方案
          • 已指定大小..."我有一个文本文件 [that] 看起来像:" :^)
          • @gnibbler - anurag 也做了同样的事情,在我写评论时评价最高的答案提出了一个全内存解决方案作为其两个提议的解决方案中的第一个。
          【解决方案5】:
          import os
          i = open(inputFilePath, 'r')
          o = open(inputFilePath+"New", 'w')
          
          lineNo = 0
          for line in input:
              lineNo += 1
              if lineNo != 3:
                  o.write(line)
              else:
                  o.write(myNewLines)
          
          i.close()
          o.close()
          os.remove(inputFilePath)
          os.rename(inputFilePath+"New", inputFilePath)
          

          希望对你有帮助

          【讨论】:

          • enumerate() 可用,无需维护自己的计数器。
          【解决方案6】:

          有几种方法可以实现这一目标

          1. 如果您的文件很小并且您的行是唯一的,您可以读取整个文件并替换该行,例如

            f.read().replace("第三行", "new line1\nnew line2\nnew line3")

          2. 但是如果文件很大或者行不完整,只需逐行读取文件,并输出每一行,但在第三行输出三个不同的行

          例如

          for i, line in enumerate(f):
              if i == 2:
                  o.write(myThreelines)
              else:
                  o.write(line)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-12-22
            • 2011-01-05
            • 2015-10-27
            • 1970-01-01
            • 2015-01-15
            • 2012-09-08
            相关资源
            最近更新 更多