在Python中为一个现有文件添加一行

Nic*_*ick 67 python prepend

我需要在文本文件的第一行添加一行,看起来我可用的唯一选项是比我期望的python更多的代码行.像这样的东西:

f = open('filename','r')
temp = f.read()
f.close()

f = open('filename', 'w')
f.write("#testfirstline")

f.write(temp)
f.close()
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法?另外,我看到这个双句柄示例比打开单个句柄进行读写('r +')更常见 - 为什么会这样?

Nic*_*ght 84

Python使很多事情变得简单,并且包含许多常见操作的库和包装器,但目标不是隐藏基本事实.

您在这里遇到的基本事实是,您通常无法在不重写整个结构的情况下将数据添加到现有的平面结构中.无论语言如何都是如此.

有一些方法可以保存文件句柄或使代码的可读性降低,其中许多都是在其他答案中提供的,但没有一种方法可以改变基本操作:您必须读取现有文件,然后写出要添加的数据,然后是您读入的现有数据.

无论如何都要保存文件句柄,但不要将此操作打包成尽可能少的代码行.事实上,永远不要寻找最少的代码行 - 这是混淆,而不是编程.

  • "永远不要去寻找最少的代码行 - 这是混淆,而不是编程" - 隐藏执行函数所花费的时间不是混淆,而是抽象.如果代码的目的是花费相应的时间来读取运行,那么代码将具有与实际完全不同的结构. (27认同)
  • “您必须读入现有文件,然后写出您想要添加的数据,然后写出您读入的现有数据” - 这并不是真的,将读取和交错进行分块和交错可以更加节省内存。写入操作,以便文件的全部内容永远不需要立即驻留在内存中。事实上,处理好这些细节将成为一个优秀的库。 (2认同)

Kar*_*tel 63

我会坚持单独的读写,但我们当然可以更简洁地表达:

Python2:

with file('filename', 'r') as original: data = original.read()
with file('filename', 'w') as modified: modified.write("new first line\n" + data)
Run Code Online (Sandbox Code Playgroud)

Python3:

with open('filename', 'r') as original: data = original.read()
with open('filename', 'w') as modified: modified.write("new first line\n" + data)
Run Code Online (Sandbox Code Playgroud)

注意:python3中没有file()函数.

  • 实际上,你也不应该在Python 2中使用文件功能.您应该始终使用Python中的`open()`函数打开文件.文件功能仅用于历史原因. (7认同)

Mor*_*ock 21

其他方法:

with open("infile") as f1:
    with open("outfile", "w") as f2:
        f2.write("#test firstline")
        for line in f1:
            f2.write(line)
Run Code Online (Sandbox Code Playgroud)

或一个班轮:

open("outfile", "w").write("#test firstline\n" + open("infile").read())
Run Code Online (Sandbox Code Playgroud)

感谢有机会思考这个问题:)

干杯


bar*_*ddu 9

with open("file", "r+") as f: s = f.read(); f.seek(0); f.write("prepend\n" + s)
Run Code Online (Sandbox Code Playgroud)