Unicode 转义文件处理错误
Unicode-escaped file processing error
我有一个原始文本文件,只包含以下行,没有换行符:
Q853 \u0410\u043D\u0434\u0440\u0435\u0439 \u0410\u0440\u0441\u0435\u043D\u044C\u0435\u0432\u0438\u0447 \u0422\u0430\u0440\u043A\u043E\u0432\u0441\u043A\u0438\u0439
字符如上所示转义,这意味着 \u05E9
实际上是一个反斜杠,后跟 5 个字母数字字符(而不是 Unicode 字符)。我正在尝试使用以下代码解码文件:
import codecs
with codecs.open("wikidata-terms20.nt", 'r', encoding='unicode_escape') as input:
with open("wikidata-terms3.nt", "w") as output:
for line in input:
output.write(line)
此处无法使用 print
,请参阅评论。
运行 它给了我以下错误:
Traceback (most recent call last):
File "terms2.py", line 5, in <module>
for line in input:
File "C:\Program Files\Python35\lib\codecs.py", line 711, in __next__
return next(self.reader)
File "C:\Program Files\Python35\lib\codecs.py", line 642, in __next__
line = self.readline()
File "C:\Program Files\Python35\lib\codecs.py", line 555, in readline
data = self.read(readsize, firstline=True)
File "C:\Program Files\Python35\lib\codecs.py", line 501, in read
newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'unicodeescape' codec can't decode bytes in position 67-71: truncated \uXXXX escape
这是怎么回事?
我是 运行 Python 3.5.1 on Windows 8.1,代码似乎适用于大多数其他 Unicode 字符(这一行是导致崩溃的第一行).
查看原始问题的编辑历史记录。
解码器读取的数据似乎在字符#72(之后)(基于 0 的字符#71)处被截断。这显然与 this bug.
有某种关系
以下代码会产生与示例中相同的错误:
open("wikidata-terms20.nt", 'r').readline()
open("wikidata-terms20.nt", 'r').readline(72)
将 readline 大小增加到输入的实际大小以上或将其设置为 -1 可消除错误:
open("wikidata-terms20.nt", 'r').readline(1000)
open("wikidata-terms20.nt", 'r').readline(-1)
可见,for line in input:
用readline()
得到了待解码的行,有效地将待解码数据截断为72个字符。
所以这里有几个解决方法:
解决方法 1:
import codecs
with open("wikidata-terms20.nt", 'r') as input:
with open("wikidata-terms3.nt", "w") as output:
for line in input:
output.write(codecs.decode(line, 'unicode_escape'))
解决方法 2:
import codecs
with codecs.open("wikidata-terms20.nt", 'r', encoding='unicode_escape') as input:
with open("wikidata-terms3.nt", "w") as output:
for line in input.readlines():
output.write(line)
我有一个原始文本文件,只包含以下行,没有换行符:
Q853 \u0410\u043D\u0434\u0440\u0435\u0439 \u0410\u0440\u0441\u0435\u043D\u044C\u0435\u0432\u0438\u0447 \u0422\u0430\u0440\u043A\u043E\u0432\u0441\u043A\u0438\u0439
字符如上所示转义,这意味着 \u05E9
实际上是一个反斜杠,后跟 5 个字母数字字符(而不是 Unicode 字符)。我正在尝试使用以下代码解码文件:
import codecs
with codecs.open("wikidata-terms20.nt", 'r', encoding='unicode_escape') as input:
with open("wikidata-terms3.nt", "w") as output:
for line in input:
output.write(line)
此处无法使用 print
,请参阅评论。
运行 它给了我以下错误:
Traceback (most recent call last):
File "terms2.py", line 5, in <module>
for line in input:
File "C:\Program Files\Python35\lib\codecs.py", line 711, in __next__
return next(self.reader)
File "C:\Program Files\Python35\lib\codecs.py", line 642, in __next__
line = self.readline()
File "C:\Program Files\Python35\lib\codecs.py", line 555, in readline
data = self.read(readsize, firstline=True)
File "C:\Program Files\Python35\lib\codecs.py", line 501, in read
newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'unicodeescape' codec can't decode bytes in position 67-71: truncated \uXXXX escape
这是怎么回事?
我是 运行 Python 3.5.1 on Windows 8.1,代码似乎适用于大多数其他 Unicode 字符(这一行是导致崩溃的第一行).
查看原始问题的编辑历史记录。
解码器读取的数据似乎在字符#72(之后)(基于 0 的字符#71)处被截断。这显然与 this bug.
有某种关系以下代码会产生与示例中相同的错误:
open("wikidata-terms20.nt", 'r').readline()
open("wikidata-terms20.nt", 'r').readline(72)
将 readline 大小增加到输入的实际大小以上或将其设置为 -1 可消除错误:
open("wikidata-terms20.nt", 'r').readline(1000)
open("wikidata-terms20.nt", 'r').readline(-1)
可见,for line in input:
用readline()
得到了待解码的行,有效地将待解码数据截断为72个字符。
所以这里有几个解决方法:
解决方法 1:
import codecs
with open("wikidata-terms20.nt", 'r') as input:
with open("wikidata-terms3.nt", "w") as output:
for line in input:
output.write(codecs.decode(line, 'unicode_escape'))
解决方法 2:
import codecs
with codecs.open("wikidata-terms20.nt", 'r', encoding='unicode_escape') as input:
with open("wikidata-terms3.nt", "w") as output:
for line in input.readlines():
output.write(line)