Python 是否可以在位修改文件中的行?

Python 是否可以在位修改文件中的行?,python,file-io,Python,File Io,是否可以逐行解析文件,并在遍历行时在位编辑行?您必须按行的大小(以字符为单位)进行备份。假设您使用了readline,则可以使用以下方法获取行的长度并进行备份: file.seek(offset[, whence]) 将“从何处”设置为“搜索当前”,将“偏移量”设置为“长度” 请参阅或查看手册页,了解seek否。您无法安全地写入正在阅读的文件,因为对该文件所做的任何更改都可能覆盖尚未阅读的内容。为了安全地执行此操作,您必须将文件读入缓冲区,根据需要更新任何行,然后重新写入文件 如果您要逐字节替

是否可以逐行解析文件,并在遍历行时在位编辑行?

您必须按行的大小(以字符为单位)进行备份。假设您使用了
readline
,则可以使用以下方法获取行的长度并进行备份:

file.seek(offset[, whence])
将“从何处”设置为“搜索当前”,将“偏移量”设置为“长度”


请参阅或查看手册页,了解
seek

否。您无法安全地写入正在阅读的文件,因为对该文件所做的任何更改都可能覆盖尚未阅读的内容。为了安全地执行此操作,您必须将文件读入缓冲区,根据需要更新任何行,然后重新写入文件


如果您要逐字节替换文件中的内容(即,如果您要替换的文本与您要替换的新字符串长度相同),那么您可以不受影响,但这是一个黄蜂窝,因此我会省去您的麻烦,只需读取完整文件,替换内存中的内容(或通过临时文件),然后再写出来。

如果您只想执行本地化更改,而不改变文件中被修改部分的长度(例如,将所有字符更改为小写),那么您实际上可以动态覆盖文件的旧内容

为此,可以使用对象的
seek()
方法进行随机文件访问

或者,您可以使用对象将整个文件视为可变字符串。请记住,
mmap
对象可能会在32位CPU上施加2-4 GB范围内的最大文件大小限制,具体取决于您的操作系统及其配置

是否可以逐行解析文件,并在遍历这些行时在位编辑一行

它可以像stdlib一样使用备份文件进行模拟

下面是一个示例脚本,用于从命令行或stdin上给定的文件中删除不满足
某些条件的行:

#!/usr/bin/env python
# grep_some_condition.py
import fileinput

for line in fileinput.input(inplace=True, backup='.bak'):
    if some_condition(line):
        print line, # this goes to the current file
例如:

$ python grep_some_condition.py first_file.txt second_file.txt

完成后,
first_file.txt
second_file.txt
文件将只包含满足
某些条件()的行。

文件输入模块的API非常难看,我发现这个任务的模块很漂亮,例如Python 3:

import in_place

with in_place.InPlace('data.txt') as file:
    for line in file:
        line = line.replace('test', 'testZ')
        file.write(line)
与fileinput的主要区别:

  • 不是劫持sys.stdout,而是返回一个新的文件句柄进行写入
  • filehandle支持所有标准I/O方法,而不仅仅是readline()

注释中的@rocksNwaves中的一些有用注释

在某些条件下是可能的。如果编辑处理过的行所产生的行较短或与处理过的行相同长,则很容易做到这一点。如果不是这样的话,它会变得更加困难,但如果经过编辑的行不是太多,这也不是不可能的。你问这个问题是因为你想处理一个大文件吗?>>>f=open('tmp','r+')>>>f.readline()'75.14\n'>>>f.readline()'100\n'>>>l=>>f.seek(-l.len(),file.seek\u CUR)>>f.seek(-len(l),os.seek\u CUR)>>f.write('999\n')>>f.close()>>参见这里的示例()我们可以在bash中完成吗?不实际写入文件中间的方法也是明智的,因为它很容易使修改原子化(也就是说,如果程序中断,文件不会以部分修改状态结束)。啊,fileinput有一个
files
参数,如果不使用
file.write()
行重新写入文件,此解决方案将删除文件中的每一行。此外,如果进程被中断,则会丢失文件中尚未重新写入的任何行。绝对危险:答案中应包含警告。否则,这似乎是一个很好的解决方案。