lem*_*ree 0 python string unicode json
在Python(3.5.0)中,我想在屏幕或文件中打印一个包含igigunicode符号(更准确地说是从Wiktionary以JSON格式检索的IPA符号)的字符串到屏幕或文件中,例如
print("\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n")
Run Code Online (Sandbox Code Playgroud)
正确打印
?w??t??m?l?n
Run Code Online (Sandbox Code Playgroud)
-但是,每当我在变量中使用字符串时,例如
ipa = '\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n'
print(ipa)
Run Code Online (Sandbox Code Playgroud)
它只是按原样打印出字符串,即
\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n
Run Code Online (Sandbox Code Playgroud)
这没有太大帮助。
我尝试了几种避免这种情况的方法(例如通过deocde/ encode),但是没有一种方法可以帮助您。
我不能合作
u'\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n'
Run Code Online (Sandbox Code Playgroud)
要么因为我已经将字符串作为变量检索(作为正则表达式匹配的结果),而且在我的代码中没有任何地方输入实际的文字。
也可能是我在从JSON结果进行转换的过程中犯了一个错误;到目前为止,我已经使用将该字节流转换为字符串str(f.read()),通过正则表达式提取了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)
Run Code Online (Sandbox Code Playgroud)
修改后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)
Run Code Online (Sandbox Code Playgroud)
对于两个版本,当使用
getIPAen("watermelon")
Run Code Online (Sandbox Code Playgroud)
我得到的是:
\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n
Run Code Online (Sandbox Code Playgroud)
有什么方法可以将字符串打印/写入为已解码状态,即使作为变量传递也是如此?
您没有此值:
ipa = '\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n'
Run Code Online (Sandbox Code Playgroud)
因为该值可以正常打印:
>>> ipa = '\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n'
>>> print(ipa)
?w??t??m?l?n
Run Code Online (Sandbox Code Playgroud)
您至少具有文字\和u字符:
ipa = '\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n'
Run Code Online (Sandbox Code Playgroud)
这些\\序列各为一个反斜杠,但已转义。由于这是JSON,因此该字符串可能还会被双引号引起来:
ipa = '"\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n"'
Run Code Online (Sandbox Code Playgroud)
由于该字符串带有文字反斜杠,因此正好打印出来:
>>> 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'
Run Code Online (Sandbox Code Playgroud)
注意回显的值如何显示可以复制并粘贴回Python的字符串文字,因此该\字符将再次为您转义。
该值是有效的JSON,它也使用\uhhhh转义序列。将其解码为JSON:
import json
print(json.loads(ipa))
Run Code Online (Sandbox Code Playgroud)
现在您有了一个适当的Python值:
>>> import json
>>> json.loads(ipa)
'?w??t??m?l?n'
>>> print(json.loads(ipa))
?w??t??m?l?n
Run Code Online (Sandbox Code Playgroud)
请注意,在Python 3中,即使为您创建文字,几乎所有代码点都直接打印repl()。该json.loads()结果直接显示在值中的所有文本,即使大多数是非ASCII。
此值不包含文字反斜杠或u字符:
>>> result = json.loads(ipa)
>>> result[0]
'?'
>>> result[1]
'w'
Run Code Online (Sandbox Code Playgroud)
附带说明一下,在调试此类问题时,您确实要使用repr()和ascii()函数,以便获得可正确再现字符串值的表示形式:
>>> 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'
Run Code Online (Sandbox Code Playgroud)
请注意,只有ascii()在实际Unicode代码点超出Latin-1范围的字符串上,才会产生实际的\uhhhh转义序列。(对于repl()输出,\uhhhh如果您的终端或控制台无法处理特定字符,Python仍然可以转义)。
至于您的更新,只需将整个响应解析为JSON,然后从中加载正确的数据。你的代码,而不是转换bytes响应体的repr()(在str()上个字节调用并没有对数据进行解码,而不是你的双逃脱逃脱这种方式)。将网络中的字节解码为UTF-8,然后将该数据提供给json.loads():
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)
Run Code Online (Sandbox Code Playgroud)
请注意,我还要确保在URL查询字符串中引用该word值。
上面列出了找到的所有IPA:
>>> getIPAen('watermelon')
?w??t??m?l?n
>>> getIPAen('chocolate')
?t??k(?)l?t
Run Code Online (Sandbox Code Playgroud)