Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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_Python 3.x_Unicode_Python Unicode - Fatal编程技术网

Python Unicode转义文件处理错误

Python Unicode转义文件处理错误,python,python-3.x,unicode,python-unicode,Python,Python 3.x,Unicode,Python Unicode,我有一个原始文本文件,只包含以下行,没有换行: 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字符)。我正在尝

我有一个原始文本文件,只包含以下行,没有换行:

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)
此处无法使用
打印
,请参见注释中的

运行它会导致以下错误:

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
回溯(最近一次呼叫最后一次):
文件“terms2.py”,第5行,在
对于行输入:
文件“C:\Program Files\Python35\lib\codecs.py”,第711行,下一步__
返回下一个(self.reader)
文件“C:\Program Files\Python35\lib\codecs.py”,第642行,下一步__
line=self.readline()
readline中的文件“C:\Program Files\Python35\lib\codecs.py”,第555行
data=self.read(readsize,firstline=True)
文件“C:\Program Files\Python35\lib\codecs.py”,第501行,已读
newchars,decodedbytes=self.decode(数据,self.errors)
UnicodeDecodeError:“UnicodeScape”编解码器无法解码位置67-71处的字节:截断\uxxx转义
发生了什么事

我在Windows8.1上运行Python3.5.1,代码似乎适用于大多数其他Unicode字符(这一行是导致崩溃的第一行)


请参阅编辑历史以了解原始问题。

解码器读取的数据似乎在字符72(基于0的字符71)处被截断。很明显,这与环境有某种联系

以下代码产生与示例中相同的错误:

open("wikidata-terms20.nt", 'r').readline()
open("wikidata-terms20.nt", 'r').readline(72)
将读线大小增加到输入的实际大小以上或将其设置为-1可消除错误:

open("wikidata-terms20.nt", 'r').readline(1000)
open("wikidata-terms20.nt", 'r').readline(-1)
显然,
对于输入中的行:
使用
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'))
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)
解决方案2:

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'))
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)

请验证您是否使用此处的数据获取错误。使用
print(line)
代替流程行注释,我没有得到任何错误。导致错误的第一行是
Q501\u05E9\u05D0\u05E8\u05DC\u05D1\u05D5\u05D3\u05DC\u05E8
,如果需要解码第一个字符。但是U+05E9似乎是有效的Unicode。这是打印的问题。请注意该错误是如何提到编码到cp850的。请参见使用python 2.7在我的Windows 7上复制。我现在将调试它。我不完全理解这个问题,但似乎已经找到了解决方法。看到我的答案了。谢谢你,效果很好!旁注,我必须为
输出指定
encoding='utf-8'