尝试搜索这么多帖子却无法得到答案。下面是我的脚本,我试图通过编写程序来执行'sed'操作。
import sys
def sed(pattern, replace, source, dest):
fin = open(source, 'r')
fout = open(dest, 'w')
for line in fin:
line = line.replace('\x00', '')
line = line.replace(pattern, replace)
print(line)
fout.write(line)
fin.close()
fout.close()
def main(name):
pattern = 'to be'
replace = 'is'
source = 'C:\....\input.txt'
dest = 'C:\...\output.txt'
sed(pattern, replace, source, dest)
if __name__ == '__main__':
main(*sys.argv)
我正在读取输入文本文件中的数据,替换字符串并将完整字符串与替换字符串一起写入输出文本文件。
我能够在'print(line)'中看到被替换的字符串,但是当我检查output.txt时,它会显示一些中文文本。
请告诉我如何在输出文本文件中获取相同的数据。
答案 0 :(得分:1)
我相信您使用的是Python 2,而不是Python 3.您的输入文件编码为UTF16,但正在使用默认文件编码。这就是您删除的额外空字符(\x00
)的原因。
然后输出文件以UTF-16字节顺序标记(BOM)(0xFF 0xFE)作为前2个字节写入,但由于删除了空字节,因此每个2字节UTF16字符的值被更改。这就是为什么它在您查看时显示为亚洲文本的原因。例如:
>>> b'to'.decode('utf16')
u'\u6f74'
>>> print(b'to'.decode('utf16'))
潴
一种解决方案是使用Python 3并在打开文件时提供编码参数:
fin = open(source, 'r', encoding='utf16')
fout = open(dest, 'w', encoding='utr16')
如果必须使用Python 2,请使用io.open()
打开文件:
import io
fin = io.open(source, 'r', encoding='utf16')
fout = io.open(dest, 'w', encoding='utf16')
在任何一种情况下,您都应该使用with
来确保在发生异常的情况下正确关闭文件:
def sed(pattern, replace, source, dest, encoding='utf16'):
with open(source, 'r', encoding=encoding) as fin:
with open(dest, 'w', encoding=encoding) as fout:
for line in fin:
line = line.replace(pattern, replace)
fout.write(line)
您不需要关闭文件,因为当with
超出范围时,它们将自动关闭,在这种情况下sed()
返回时。