Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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';即使使用显式UTF-8编码,s UTF-8编码也会产生奇数结果_Python_Json_Encoding_Utf 8 - Fatal编程技术网

Python';即使使用显式UTF-8编码,s UTF-8编码也会产生奇数结果

Python';即使使用显式UTF-8编码,s UTF-8编码也会产生奇数结果,python,json,encoding,utf-8,Python,Json,Encoding,Utf 8,我正在解析一些JSON(特别是Amazon公开提供的Amazon评论文件)。我正在进行一行一行的解析,转换为Pandas DataFrame并动态插入SQL。我发现了一些非常奇怪的事情。我使用UTF-8打开json文件。当我用记事本打开文件时,在文件本身中我没有看到任何奇怪的符号或任何东西。例如,review的子字符串: The temperature control doesn’t hold to as tight a temperature as some of the others rep

我正在解析一些JSON(特别是Amazon公开提供的Amazon评论文件)。我正在进行一行一行的解析,转换为Pandas DataFrame并动态插入SQL。我发现了一些非常奇怪的事情。我使用UTF-8打开json文件。当我用记事本打开文件时,在文件本身中我没有看到任何奇怪的符号或任何东西。例如,review的子字符串:

The temperature control doesn’t hold to as tight a temperature as some of the others reported.
但当我解析它并检查字符串的内容时:

The temperature control doesn\xe2\x80\x99t hold to as tight a temperature as some of the others reported. 
为什么会这样?我怎么看不懂呢

我目前的代码如下:

def parseJSON(path):
  g = io.open(path,'r',encoding='utf8')
  for l in g:
      yield eval(l)



for l in parseJSON(r"reviews.json"):
    for review in l["reviews"]:
        df = {}
        df[l["url"]] = review["review"]
        dfInsert = pd.DataFrame( list(df.items()), columns = ["url", "Review"])
失败的文件子集是否存在:

首先,您不应该使用解析来自不安全(在线)源的文本。如果数据在中,则应使用JSON解析器。这就是JSON被发明的原因——提供安全的序列化和反序列化

在您的情况下,使用标准模块:

由于您的JSON文件包含,因此您应该使用知道如何剥离它的编解码器,即

如果您的文件每行包含一个JSON对象,您可以这样读取:

def parseJSON(path):
    with io.open(path, 'r', encoding='utf-8-sig') as f:
        for line in f:
            yield json.loads(line)

现在回答为什么您看到的是
dods\xe2\x80\x99t
而不是
dots
。如果将字节
\xe2\x80\x99
解码为UTF-8,则会得到:

>>> '\xe2\x80\x99'.decode('utf8')`
u'\u2019'
那是什么Unicode码点

>>> unicodedata.name(u'\u2019')
'RIGHT SINGLE QUOTATION MARK'
好的,现在在Python2中
eval()
it时会发生什么?首先,请注意,在Python2字符串领域,Unicode并不是真正的一等公民(Python3修复了这一点)

因此,
eval
尝试将字符串(Python 2中的一系列字节)解析为Python表达式:

>>> eval('"’"')
'\xe2\x80\x99'
请注意(在我使用UTF-8的控制台中),即使我键入
,它也表示为3个字节的序列

甚至说它应该是一个
unicode
,也无济于事:

>>> eval('u"’"')
u'\xe2\x80\x99'
帮助的是告诉Python如何解释源代码/字符串后面的一系列字节,即编码是什么(请参阅):


为什么要使用
eval
而不是
json.loads(…)
?那可能是你的问题。还有python2或python3?@AnthonySottile它是2.7.13 | Continuum Analytics,Inc.With json.loads()结果完全相同文件是怎么写的?在
中的撇号不是一个简单的单引号
=
\x27
,这是正确的单引号==
\u2019
。如果您想摆脱花哨的引号等并用简单的ASCII等价物替换它们,请查看。最好让您的程序正确处理Unicode,但这并不总是一个选项。这很有意义,谢谢。但是json.loads会产生完全相同的结果。我遇到的问题是,当我尝试将这些内容加载到SQL中时,得到的错误是它无法解码这个字节。因此,我认为文件读取步骤有问题。即使我看到这样的输出并不一定意味着文件读取不正确,我是否正确?无法正确处理unicode。但是我们可以测试的唯一方法是您作为失败的示例输入给出的问题。@MaximHaytovich,请参阅每行一个JSON对象的更新。谢谢,这非常有意义。尽管在这种情况下,我似乎不得不对文件中的每个奇怪符号重复相同的内容——或者依赖Unidecode或smth,就像这样?
>>> eval('u"’"')
u'\xe2\x80\x99'
>>> eval('# encoding: utf-8\nu"’"')
u'\u2019'