我需要在文本文件的第一行添加一行,看起来我可用的唯一选项是比我期望的更多代码行。像这样:
f = open('filename','r')
temp = f.read()
f.close()
f = open('filename', 'w')
f.write("#testfirstline")
f.write(temp)
f.close()
有没有更简单的方法?另外,我看到这个双句柄示例比打开单个句柄进行读写('r +')更常见 - 为什么会这样?
答案 0 :(得分:78)
Python使很多事情变得简单,并且包含许多常见操作的库和包装器,但目标不是隐藏基本事实。
您在这里遇到的基本事实是,您通常无法在不重写整个结构的情况下将数据添加到现有的平面结构中。无论语言如何都是如此。
有多种方法可以保存文件句柄或使代码的可读性降低,其中许多都是在其他答案中提供的,但没有一种方法可以改变基本操作:您必须读入现有文件,然后写出要预先添加的数据,然后是您阅读的现有数据。
通过各种方式保存文件句柄,但不要将此操作打包成尽可能少的代码行。事实上,永远不要寻找最少的代码行 - 这是混淆,而不是编程。
答案 1 :(得分:52)
我会坚持单独的读写,但我们当然可以更简洁地表达:
Python2:
with file('filename', 'r') as original: data = original.read()
with file('filename', 'w') as modified: modified.write("new first line\n" + data)
Python3:
with open('filename', 'r') as original: data = original.read()
with open('filename', 'w') as modified: modified.write("new first line\n" + data)
注意:python3中没有file()函数。
答案 2 :(得分:21)
其他方法:
with open("infile") as f1:
with open("outfile", "w") as f2:
f2.write("#test firstline")
for line in f1:
f2.write(line)
或一个班轮:
open("outfile", "w").write("#test firstline\n" + open("infile").read())
感谢有机会思考这个问题:)
干杯
答案 3 :(得分:9)
with open("file", "r+") as f: s = f.read(); f.seek(0); f.write("prepend\n" + s)
答案 4 :(得分:3)
您可以使用以下方法保存一个写入呼叫:
f.write('#testfirstline\n' + temp)
使用'r +'时,您必须在阅读后和写作前回放文件。
答案 5 :(得分:3)
这是我认为清晰灵活的3号班轮。它使用list.insert函数,所以如果你真的想要在文件前面加上l.insert(0,'insert_str')。当我为我正在开发的Python模块实际执行此操作时,我使用了l.insert(1,'insert_str'),因为我想跳过'# - - 编码:utf-8 - - '第0行的字符串。这是代码。
f = open(file_path, 'r'); s = f.read(); f.close()
l = s.splitlines(); l.insert(0, 'insert_str'); s = '\n'.join(l)
f = open(file_path, 'w'); f.write(s); f.close()
答案 6 :(得分:2)
这可以在不将整个文件读入内存的情况下完成工作,但它可能无法在Windows上运行
def prepend_line(path, line):
with open(path, 'r') as old:
os.unlink(path)
with open(path, 'w') as new:
new.write(str(line) + "\n")
shutil.copyfileobj(old, new)
答案 7 :(得分:0)
一种可能性如下:
import os
open('tempfile', 'w').write('#testfirstline\n' + open('filename', 'r').read())
os.rename('tempfile', 'filename')
答案 8 :(得分:0)
如果您希望在特定文本之后添加文件,则可以使用以下功能。
def prepend_text(file, text, after=None):
''' Prepend file with given raw text '''
f_read = open(file, 'r')
buff = f_read.read()
f_read.close()
f_write = open(file, 'w')
inject_pos = 0
if after:
pattern = after
inject_pos = buff.find(pattern)+len(pattern)
f_write.write(buff[:inject_pos] + text + buff[inject_pos:])
f_write.close()
首先,您打开文件,阅读并将其全部保存到一个字符串中。 然后我们尝试在字符串中找到注入将发生的字符数。然后使用单个写入和字符串的一些智能索引,我们可以重写整个文件,包括现在注入的文本。
答案 9 :(得分:0)
我看不到东西吗,或者我们不能仅仅使用足够大的缓冲区读入输入文件一部分(而不是全部内容),然后使用该缓冲区遍历文件打开时并保持交换文件<->缓冲区内容?
这似乎比读取 整个 内存中的 内容(在内存中修改)更有效(特别是对于大文件) 并将其写回到同一文件或(甚至更糟)另一文件。抱歉,现在我没有时间实施示例代码段,我稍后再讲,但是也许您明白了。