Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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_Json_String_Unicode - Fatal编程技术网

Python:打印存储为变量的unicode字符串

Python:打印存储为变量的unicode字符串,python,json,string,unicode,Python,Json,String,Unicode,在Python(3.5.0)中,我希望将包含unicode符号(更准确地说,是以JSON格式从Wiktionary检索到的IPA符号)的字符串打印到屏幕或文件中,例如 print("\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n") 正确打印 ˈwɔːtəˌmɛlən -但是,每当我在变量中使用字符串时,例如 ipa = '\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n' print(ipa)

在Python(3.5.0)中,我希望将包含unicode符号(更准确地说,是以JSON格式从Wiktionary检索到的IPA符号)的字符串打印到屏幕或文件中,例如

print("\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n")
正确打印

ˈwɔːtəˌmɛlən
-但是,每当我在变量中使用字符串时,例如

ipa = '\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n'
print(ipa)
它只是按原样打印字符串,即

\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n
这没什么帮助

我已经尝试了几种方法来避免这种情况(比如通过
deocde
/
encode
),但这些方法都没有帮助

我不能和你一起工作

u'\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n'
因为我已经将字符串作为变量检索(作为正则表达式匹配的结果),所以在代码中没有输入实际的文本

也可能是我在从JSON结果转换的过程中犯了一个错误;现在,我已经使用
str(f.read())
将字节流转换成字符串,通过regex提取IPA部分(并对双反斜杠进行替换),并将其存储在字符串变量中

编辑:
这是我到目前为止的代码:

def getIPAen(word):
    url = "https://en.wiktionary.org/w/api.php?action=query&titles=" + word + "&prop=revisions&rvprop=content&format=json"
    jsoncont = str((urllib.request.urlopen(url)).read())
    jsonmatch = re.search("\{IPA\|/(.*?)/\|", jsoncont).group(1)
    #print("jsomatch: " + jsonmatch)
    ipa = jsonmatch.replace("\\\\", "\\")
    #print("ipa: " + ipa)
    print(ipa)
使用
json.loads修改后

def getIPAen(word):
    url = "https://en.wiktionary.org/w/api.php?action=query&titles=" + word + "&prop=revisions&rvprop=content&format=json"
    jsoncont = str((urllib.request.urlopen(url)).read())
    jsonmatch = re.search("\{IPA\|/(.*?)/\|", jsoncont).group(1)
    #print("jsonmatch: " + jsonmatch)
    jsonstr = "\"" + jsonmatch + "\""
    #print("jsonstr: " + jsonstr)
    jsonloads = json.loads(jsonstr)
    #print("jsonloads: " + jsonloads)
    print(jsonloads)
import json
import re
import urllib.request
from urllib.parse import quote_plus


baseurl = "https://en.wiktionary.org/w/api.php?action=query&titles={}&prop=revisions&rvprop=content&format=json"

def getIPAen(word):
    url = baseurl.format(quote_plus(word))
    jsondata = urllib.request.urlopen(url).read().decode('utf8')
    data = json.loads(jsondata)
    for page in data['query']['pages'].values():
        for revision in page['revisions']:
            if 'IPA' in revision['*']:
                ipa = re.search(r"{IPA\|/(.*?)/\|", revision['*']).group(1)
                print(ipa)
对于这两个版本,当使用

getIPAen("watermelon")
我得到的是:

\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n

是否有任何方法可以将字符串打印/写入为已解码,即使作为变量传递?

您没有此值:

ipa = '\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n'
因为该值打印得很好:

>>> ipa = '\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n'
>>> print(ipa)
ˈwɔːtəˌmɛlən
您至少有文字
\
u
字符:

ipa = '\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n'
>>> result = json.loads(ipa)
>>> result[0]
'ˈ'
>>> result[1]
'w'
那些
\\
序列都是一个反斜杠,但已转义。因为这是JSON,所以字符串可能也被双引号包围:

ipa = '"\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n"'
因为该字符串有文字反斜杠,所以这正是要打印的内容:

>>> ipa = '"\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n"'
>>> print(ipa)
"\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n"
>>> ipa[1]
'\\'
>>> print(ipa[1])
\
>>> ipa[2]
'u'
请注意,回显的值如何显示可以复制并粘贴回Python的字符串文字,因此
\
字符将再次为您转义

该值是有效的JSON,它也使用转义序列。将其解码为JSON:

import json

print(json.loads(ipa))
现在您有了一个合适的Python值:

>>> import json
>>> json.loads(ipa)
'ˈwɔːtəˌmɛlən'
>>> print(json.loads(ipa))
ˈwɔːtəˌmɛlən
注意,在Python3中,几乎所有的代码点都是直接打印的,即使
repl()
为您创建了一个文本。
json.loads()
结果直接显示值中的所有文本,即使大多数文本是非ASCII文本

此值不包含文字反斜杠或
u
字符:

ipa = '\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n'
>>> result = json.loads(ipa)
>>> result[0]
'ˈ'
>>> result[1]
'w'
作为补充说明,在调试此类问题时,您确实希望使用and函数,以便获得能够正确再现字符串值的表示形式:

>>> print(repr(ipa))
'"\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n"'
>>> print(ascii(ipa))
'"\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n"'
>>> print(repr(result))
'ˈwɔːtəˌmɛlən'
>>> print(ascii(result))
'\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n'
请注意,只有实际Unicode码点超出拉丁语-1范围的字符串上的
ascii()
才会产生实际的
\uhhh
转义序列。(对于
repl()

至于您的更新,只需将整个响应解析为JSON,并从中加载正确的数据。您的代码将
字节
响应正文转换为
repr()
(对字节的
str()
调用不会解码数据;相反,您会以这种方式双重转义)。将网络中的字节解码为UTF-8,然后将数据馈送到
json.loads()

注意,我还确保在URL查询字符串中引用
word

上面打印出它找到的任何IPA:

>>> getIPAen('watermelon')
ˈwɔːtəˌmɛlən
>>> getIPAen('chocolate')
ˈtʃɒk(ə)lɪt

您没有此值:

ipa = '\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n'
因为该值打印得很好:

>>> ipa = '\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n'
>>> print(ipa)
ˈwɔːtəˌmɛlən
您至少有文字
\
u
字符:

ipa = '\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n'
>>> result = json.loads(ipa)
>>> result[0]
'ˈ'
>>> result[1]
'w'
那些
\\
序列都是一个反斜杠,但已转义。因为这是JSON,所以字符串可能也被双引号包围:

ipa = '"\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n"'
因为该字符串有文字反斜杠,所以这正是要打印的内容:

>>> ipa = '"\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n"'
>>> print(ipa)
"\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n"
>>> ipa[1]
'\\'
>>> print(ipa[1])
\
>>> ipa[2]
'u'
请注意,回显的值如何显示可以复制并粘贴回Python的字符串文字,因此
\
字符将再次为您转义

该值是有效的JSON,它也使用转义序列。将其解码为JSON:

import json

print(json.loads(ipa))
现在您有了一个合适的Python值:

>>> import json
>>> json.loads(ipa)
'ˈwɔːtəˌmɛlən'
>>> print(json.loads(ipa))
ˈwɔːtəˌmɛlən
注意,在Python3中,几乎所有的代码点都是直接打印的,即使
repl()
为您创建了一个文本。
json.loads()
结果直接显示值中的所有文本,即使大多数文本是非ASCII文本

此值不包含文字反斜杠或
u
字符:

ipa = '\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n'
>>> result = json.loads(ipa)
>>> result[0]
'ˈ'
>>> result[1]
'w'
作为补充说明,在调试此类问题时,您确实希望使用and函数,以便获得能够正确再现字符串值的表示形式:

>>> print(repr(ipa))
'"\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n"'
>>> print(ascii(ipa))
'"\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n"'
>>> print(repr(result))
'ˈwɔːtəˌmɛlən'
>>> print(ascii(result))
'\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n'
请注意,只有实际Unicode码点超出拉丁语-1范围的字符串上的
ascii()
才会产生实际的
\uhhh
转义序列。(对于
repl()

至于您的更新,只需将整个响应解析为JSON,并从中加载正确的数据。您的代码将
字节
响应正文转换为
repr()
(对字节的
str()
调用不会解码数据;相反,您会以这种方式双重转义)。将网络中的字节解码为UTF-8,然后将数据馈送到
json.loads()

注意,我还确保在URL查询字符串中引用
word

上面打印出它找到的任何IPA:

>>> getIPAen('watermelon')
ˈwɔːtəˌmɛlən
>>> getIPAen('chocolate')
ˈtʃɒk(ə)lɪt

请创建一个简短、完整的程序来演示问题。请将程序及其输出复制粘贴到您的问题中。有关更多信息,请参阅和,更一般地说,请参阅。是生成所需输出的示例程序。@Robᵩ 我在帖子中添加了我的完整代码。这样可以吗我想那会变得太长。很抱歉给您带来不便,这是我第一次在这里发帖。对于您的示例程序:谢谢,它很有效-实际上我的示例对