如果在python中输出到文本文件,则替换的字符串不可见

时间:2018-04-23 00:32:16

标签: python-3.x

尝试搜索这么多帖子却无法得到答案。下面是我的脚本,我试图通过编写程序来执行'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时,它会显示一些中文文本。

请告诉我如何在输出文本文件中获取相同的数据。

1 个答案:

答案 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()返回时。