在 python 中更改文件中的字符串

Change string in file in python

我在 python 中更改文件时遇到问题。我需要改变一个字符串。 该文件不是文本文件,但可以使用文本编辑器进行编辑。

这是我的代码:

with open(esp,"r") as f:                
            content=f.readlines()         
with open(esp_carsat,"w") as f:
        for line in content:
                f.write(line.replace("201","202")))

问题是我认为内容是以字节为单位的。 '\xff\xfe<\x00I\x00n\x00s\x00t\x00a\x00n\x00c\x00e\x00N\x00a\x00m\x00e\x00s\x00>\x00\r\x00\n'

所以我的替换不起作用。我试着玩编码,但之后文件不可读。此外,我在文件中有重音符号 (é,è...)

有没有办法做我想做的事?

您有 UTF-16 编码 数据。解码为 Unicode 文本,替换,然后再次编码回 UTF-16:

>>> data = '\xff\xfe<\x00I\x00n\x00s\x00t\x00a\x00n\x00c\x00e\x00N\x00a\x00m\x00e\x00s\x00>\x00\r\x00\n\x00'
>>> data.decode('utf16')
u'<InstanceNames>\r\n'

我不得不附加一个额外的 \x00 来解码它;通过读取文件而不解码 Python 拆分 \n 上的行并将 \x00 留给 下一个 行。

Unicode 数据可以很好地处理重音符号,无需进一步处理。

使用 io.open() 最简单的方法是打开为您解码和编码的文件对象:

import io

with io.open(esp, "r", encoding='utf16') as f:                
    content=f.readlines()         

with open(esp_carsat, "w", encoding='utf16') as f:
    for line in content:
        f.write(line.replace("201", "202")))

它是 UTF-16-LE 数据:

>>> b
'\xff\xfe<\x00I\x00n\x00s\x00t\x00a\x00n\x00c\x00e\x00N\x00a\x00m\x00e\x00s\x00>\x00\r\x00\n'
>>> print(b[:-1].decode('utf-16-le'))
<InstanceNames>