Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:Unicode源文件在字符之间添加空格(实际上是空字节)_Python_Unicode_Encoding_Decoding - Fatal编程技术网

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

Python:Unicode源文件在字符之间添加空格(实际上是空字节),python,unicode,encoding,decoding,Python,Unicode,Encoding,Decoding,我是个新手。然而,我设法从一个txt文件(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.

我是个新手。然而,我设法从一个txt文件(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的形式自动传递的,因此每次手动更改源文件是不实际的。我通读了很多其他编码/编码/解码问题。但我完全迷失了方向,不知道如何解决这个问题。哪个是正确的命令?在剧本的哪个地方?还是我完全错了,这与编码问题没有任何关系?

我相当肯定您的输入文件是UTF-16编码的,并且您看到的空间实际上是空字节

试一试


查看问题是否仍然存在。

如何打开
OutFile
?您使用的是哪种版本的Python,以及您如何读取文件以查看字符之间的“空格”?文件从来都不是“Unicode”-它可以使用多种编码,可以解码为Unicode字符串(如UTF-8、UTF-16-LE、UTF-16-be、UTF-32…),但文件本身由简单的字节组成。我怀疑OP被某些微软产品误导了,这些产品提供了“另存为Unicode”等选项。使用UTF-16-LE,正如我们在这里看到的。这并不是说你错了。Windows会在你编辑的任何文本文件中添加垃圾空值,因此当你使用任何合适的编辑器打开文件时,你总是会得到“Te x t c o n t t t t”而不是“文本内容”。从来没有遵循这个逻辑。你是对的,似乎是UTF-16。我试过你的建议,但没能奏效。可能是我弄错了。但是,我浏览了一个查看其他选项,它可以很好地使用:
infle=codecs.open(sys.argv[1],“r”,“utf-16”)
对于像我这样的初学者:不要忘记在开始时包含
导入编解码器。谢谢你的帮助。保存了我的一天。@user3037270,不要忘记接受这个答案,因为你的一天已经保存了。:)我只想补充一点,您不希望通过以linefeed结尾的行来迭代以utf-16编码的文件。这样做似乎会把第一行之后的每一行都搞糟,因为字符串是在单个换行字节之后断开的,而不是utf-16所需的两个字节。这使得每一行的开头都有一个额外的字节挂起,从而影响了解码。我在遍历通过urllib.request.urlopen()下载的utf-16-le编码文件并尝试依次解码每一行时遇到了这种情况。您必须立即解码整个响应,或者至少在迭代方面更聪明一些。
with open("myfile.txt", "r", encoding="utf-16") as infile:
    lines = infile.readlines()