在 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>
我在 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>