【发布时间】:2018-07-19 16:56:26
【问题描述】:
我正在尝试使用 Python 读取 Windows 生成的 UTF-16 文件。据我了解,BOM 是 FEFF。这就是这个文件的开头。但是,当我将文件读入 Python 时,字节似乎被交换了。
(venv) [user]:~/consolidate$ head -c 16 temp.txt | od -x
0000000 feff 0022 0076 0065 0072 0073 0069 006f
0000020
(venv) [user]:~/consolidate$ python
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> with open('temp.txt', 'rb') as f:
... str = f.readline()
... print(str)
...
b'\xff\xfe"\x00v\x00e\x00r\x00s\x00i\x00o\x00n...
使用head,第一个字符是feff 0022。使用 Python,它似乎是 fffe2200。这是怎么回事?
编辑:我的问题是关于字节顺序的。几点:
- 我不想解码文件。这是一个 10GB 的文件,需要按特定顺序拆分。
- 它似乎只在第一行。
- 回写到文件会保留原始顺序。
第二行阅读示例:
>>> with open('temp.txt', 'rb') as f:
... str1 = f.readline()
... str2 = f.readline()
...
>>> str2
b'\x00"\x00"\x00`\x00"\x00P\x
【问题讨论】:
-
b’...’是一个字节流,您看到的是文件中字节的顺序,而不是解码后的字符。 -
看起来像字节序问题。根据@Mr.的回答。下面的J,如果指定编码,Python应该会自动识别是
UTF-16LE还是UTF16-BE。 -
@DavidMaze 我的问题是关于字节顺序的。为什么看起来好像变了?
-
因为
od -x似乎正在以 little-endian 字节交换顺序解码字节对。od -t x1应该以与问题中相同的顺序转储字节。
标签: python python-3.x utf-16