Python:读一行,然后写回同一个lin

2024-10-01 13:33:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python为html制作一个模板更新程序。我读了一行,并将其与模板文件进行比较,看看是否有任何需要更新的更改。然后我想把任何更改(如果有的话)写回刚才读到的同一行。在

读取文件时,我的文件指针现在位于readline()之后的下一行。有没有我可以写回同一行,而不必打开两个文件句柄进行读写?在

下面是我要做的事情的代码片段:

cLine = fp.readline()
if cLine != templateLine:
   # Here is where I would like to write back to the line I read from
   # in cLine

Tags: 文件to代码程序模板readlineifhere
2条回答

更新文本文件中的行-非常困难

SO中的许多问题都试图读取文件并立即更新。在

虽然这在技术上是可能的,但非常困难。在

(文本)磁盘上的文件不是按行组织的,而是按字节组织的。在

问题是,在旧行上读取的字节数通常与新的不同,这会使结果文件混乱。在

通过创建新文件进行更新

虽然听起来效率低下,但从编程的角度来看,这是最有效的方法。在

只需从一侧的文件中读取,在另一侧写入另一个文件,关闭文件并将新创建的内容复制到旧文件上。在

或者在内存中创建文件,最后在关闭旧文件后对旧文件执行写入操作。在

在操作系统级别,这与从Python中看到的有点不同——从Python来看,一个文件几乎就像一个字符串列表,每个字符串都有任意长度,因此似乎很容易将一行替换为其他内容,而不会影响其他行:

l = ["Hello", "world"]
l[0] = "Good bye"

不过,实际上,任何文件都只是一个字节流,字符串之间没有任何“填充”。因此,只有当结果字符串的长度与源字符串的长度完全相同时,才能就地覆盖数据,否则只会覆盖下面的行。在

如果是这样(您的处理保证不会更改字符串的长度),您可以将文件“倒带”到行的开头,并用新数据覆盖该行。以下脚本将文件中的所有行就地转换为大写:

^{pr2}$

有点关系:Undo a Python file readline() operation so file pointer is back in original state

这种方法只有在保证输出行具有相同的长度时才是合理的,并且当您正在处理的文件非常大,因此您必须对其进行适当的修改。在

在所有其他情况下,只需在内存中构建输出并立即将其写回,会更加容易和高效。另一个选择是写入临时文件,然后删除原始文件并重命名临时文件,以便替换原始文件。在

相关问题 更多 >