Python:Unicode源文件在字符之间添加空格(实际上是空字节)

7

我是一名新手。然而,我成功地从一个文本文件(Unicode)中提取了一些行,并将它们写入另一个文件。

lines = InFile.readlines()
OutFile.writelines(lines[3:])

它能够工作,但(我认为)由于编码问题,在输出文件中每个字符之间添加了一个空格。

结果示例:

2 0 1 3 - 1 2 - 2 3 ; ; 3 6 0 . 3 7 
2 0 1 3 - 1 2 - 2 4 ; ; 0 . 0 0 

源文件中的行数:

2013-12-23;;360.37
2013-12-24;;0.00

如果在运行脚本之前将 txt 源文件保存为 ANSI 编码,我就能收到正确的结果。但由于另一个软件自动以 Unicode 编码形式交付源文件,每次都手动更改不太实际。我阅读了许多其他编码、解码和编码问题。但我完全迷失了方向,不知道如何解决这个问题。哪个是正确的命令?在脚本的哪个位置?或者我完全错了,这与编码问题无关?

2
OutFile 是如何打开的?您使用的是哪个版本的 Python,以及您是如何读取文件以查看字符之间的“空格”的? - Martijn Pieters
2
一个文件从来不是“Unicode” - 它可以使用各种编码,这些编码可以被解码为Unicode字符串(如UTF-8、UTF-16-LE、UTF-16-BE、UTF-32...),但文件本身由简单的字节组成。 - Tim Pietzcker
1
我怀疑 OP 被某些微软产品误导了,这些产品提供了“另存为 Unicode”的选项。并使用 UTF-16-LE,就像我们在这里看到的一样。这并不是说你错了。 - Peter DeGlopper
Windows在编辑任何文本文件时都会添加垃圾空字符,因此当您使用任何好的编辑器打开文件时,您总是会得到“t e x t c o n t e n t”而不是“text content”。我从来没有遵循过这种逻辑。 - Overmind
1个回答

13
我相当确定你的输入文件是UTF-16编码,而你看到的空格实际上是空字节。
尝试:
with open("myfile.txt", "r", encoding="utf-16") as infile:
    lines = infile.readlines()

并查看问题是否仍然存在。


你是对的,看起来是UTF-16编码。我尝试了你的建议,但无法使其工作。可能是我犯了一个错误。然而,我浏览了一些其他选项,并且使用以下代码可以正常工作:InFile = codecs.open(sys.argv[1], "r", "utf-16") 对于像我这样的初学者,请不要忘记在开头包含import codecs。感谢您的帮助。救了我的一天。 - user3037270
@user3037270,不要忘记接受这个答案,因为它拯救了你的一天。 :) - bzlm
我想补充一点,如果你不想通过以换行符结尾的行迭代遍历一个使用utf-16编码的文件,因为这样做似乎会破坏第一行之后的每一行,因为字符串在单个换行符字节之后被分割而不是需要两个字节的utf-16。这会导致每一行开头多出一个额外的字节,从而破坏解码过程。当我迭代遍历一个通过urllib.request.urlopen()下载的utf-16-le编码文件并尝试逐行解码时,我遇到了这个问题。你必须一次性解码整个响应,或者至少要更加聪明地进行迭代。 - yukondude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接