关于python:如何修改文件的最后一行?

How do I modify the last line of a file?

我文件的最后一行是:

29-dez,40,

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

29-Dez,40,90,100,50

注意:我不想写新行。我想在29-Dez,40,后面加一行新值。

我是Python的新手。我在处理文件时遇到了很多困难,对于我来说,我看到的每一个例子似乎都很困难。


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

另一方面,您的文件可能真的很大-至少有多个GBS。在这种情况下:最后一行可能以一个新行字符结束,如果您寻求该位置,您可以在最后一行末尾用新文本覆盖它。

所以也许:

1
2
3
4
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()

(不同平台上的模线端)


要扩展Doug所说的内容,为了将文件内容读取到数据结构中,可以使用文件对象的readlines()方法。

下面的代码示例将文件读取到"行"列表中,编辑最后一行,然后将其写回文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/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)

如果文件非常大,那么这种方法将无法很好地工作,因为这样每次都会将所有的文件行读取到内存中,并将它们写回文件中,这是非常低效的。不过,对于一个小文件来说,这很好。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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()

摘要:此代码段接受要插入的文件名和文本块。它找到已经存在的最后一个导入语句,并将文本粘贴到该位置。

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


不要直接处理文件,以类的形式创建一个适合您需要的数据结构,并对文件方法进行读/写。