【问题标题】:How do I modify the last line of a file?如何修改文件的最后一行?
【发布时间】:2023-04-09 01:49:01
【问题描述】:

我文件的最后一行是:

29-dez,40,

如何修改该行使其显示为:

29-Dez,40,90,100,50

注意:我不想写新行。我想采取同样的做法并在29-Dez,40,之后添加新值

我是 python 新手。我在处理文件时遇到了很多麻烦,对我来说,我看到的每个示例似乎都很困难。

【问题讨论】:

  • 很难,因为很难。对于具有可变长度行的文本文件,您正在做的事情并不明智。
  • 请参阅 stackoverflow.com/questions/328059/… 了解此问题的后续内容。
  • 我对您的问题进行了相当大的修改,如果我误解了什么,请告诉我。 S. Lott 也是对的,虽然看起来应该很简单,但修改一个文件实际上是相当困难的。

标签: python file


【解决方案1】:

要扩展Doug said,为了将文件内容读入数据结构,您可以使用文件对象的readlines() method

以下代码示例将文件读入“行”列表,编辑最后一行,然后将其写回文件:

#!/usr/bin/python

MYFILE="file.txt"

# read the file into a list of lines
lines = open(MYFILE, 'r').readlines()

# now edit the last line of the list of lines
new_last_line = (lines[-1].rstrip() + ",90,100,50")
lines[-1] = new_last_line

# now write the modified list back out to the file
open(MYFILE, 'w').writelines(lines)

如果文件非常大,那么这种方法将无法正常工作,因为这每次都会将所有文件行读入内存并将它们写回文件,这是非常低效的。但是,对于一个小文件,这将正常工作。

【讨论】:

    【解决方案2】:

    除非文件很大,否则您可能会发现将整个文件读入数据结构(可能只是行列表)更容易,然后在内存中修改数据结构,最后将其写回到文件中。

    另一方面,也许您的文件 真的很大 - 至少有几个 GB。在这种情况下:最后一行可能以换行符终止,如果您寻找该位置,您可以用最后一行末尾的新文本覆盖它。

    也许:

    f = open("foo.file", "wb")
    f.seek(-len(os.linesep), os.SEEK_END) 
    f.write("new text at end of last line" + os.linesep)
    f.close() 
    

    (不同平台上的模行结尾)

    【讨论】:

    • 对于 Python 3.2 及更高版本,您只能从文件(文本文件)的开头进行查找操作。
    【解决方案3】:

    不要直接使用文件,以类的形式创建适合您需求的数据结构,并使用读取/写入文件方法。

    【讨论】:

      【解决方案4】:

      我最近写了一个脚本来做一些与此非常相似的事情。它将遍历一个项目,查找所有模块依赖项并添加任何缺少的导入语句。我不会把这篇文章和整个脚本混在一起,但我会展示我是如何修改文件的。

      import os
      from mmap import mmap
      
      def insert_import(filename, text):
          if len(text) < 1:
              return
          f = open(filename, 'r+')
          m = mmap(f.fileno(), os.path.getsize(filename))
          origSize = m.size()
          m.resize(origSize + len(text))
          pos = 0
          while True:
              l = m.readline()
              if l.startswith(('import', 'from')):
                  continue
              else:
                  pos = m.tell() - len(l)
                  break
          m[pos+len(text):] = m[pos:origSize]
          m[pos:pos+len(text)] = text
          m.close()
          f.close()
      

      总结:这个 sn-p 需要一个文件名和一个要插入的文本块。它找到已经存在的最后一个导入语句,并将文本粘贴到该位置。

      我建议最关注的部分是mmap的使用。它允许您以与处理字符串相同的方式处理文件。非常方便。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多