使用Python 3,我从URL请求json文档.
response = urllib.request.urlopen(request)
Run Code Online (Sandbox Code Playgroud)
该response对象是一个类似文件的对象read和readline方法.通常,可以使用以文本模式打开的文件创建JSON对象.
obj = json.load(fp)
Run Code Online (Sandbox Code Playgroud)
我想做的是:
obj = json.load(response)
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,因为urlopen以二进制模式返回文件对象.
当然,解决方法是:
str_response = response.read().decode('utf-8')
obj = json.loads(str_response)
Run Code Online (Sandbox Code Playgroud)
但这感觉很糟糕......
有没有更好的方法可以将字节文件对象转换为字符串文件对象?或者我错过任何参数urlopen或json.load给出编码?
我需要一种有效的(读取本机)方式将ArrayBuffer转换为需要在多部分帖子上使用的base64字符串.
我正在尝试将一些UTF-8字符输入到TextMate中的LaTeX文件中(其默认编码为UTF-8),但LaTeX似乎并不理解它们.Running cat my_file.tex在Terminal中正确显示字符.跑步ls -al显示我以前从未见过的东西:文件列表中的"@":
-rw-r--r--@ 1 me users 2021 Feb 11 18:05 my_file.tex
Run Code Online (Sandbox Code Playgroud)
(而且,是的,我正在使用\usepackage[utf8]{inputenc}LaTeX.)
我发现了iconv,但似乎无法告诉我编码是什么 - 它只会在我弄清楚之后转换.
我见过很少的py脚本在脚本的顶部使用它.在什么情况下应该使用它?
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
Run Code Online (Sandbox Code Playgroud) PEP 263定义了如何声明Python源代码编码.
通常,Python文件的前两行应该以:
#!/usr/bin/python
# -*- coding: <encoding name> -*-
Run Code Online (Sandbox Code Playgroud)
但我看到很多文件以:
#!/usr/bin/python
# -*- encoding: <encoding name> -*-
Run Code Online (Sandbox Code Playgroud)
=> 编码而不是编码.
那么声明文件编码的正确方法是什么?
是否允许编码,因为使用的正则表达式是懒惰的?或者它只是声明文件编码的另一种形式?
我问这个问题是因为PEP没有谈论编码,它只是谈论编码.
我正在编写一个Python(Python 3.3)程序,使用POST方法将一些数据发送到网页.主要用于调试过程我得到页面结果并使用print()函数在屏幕上显示它.
代码是这样的:
conn.request("POST", resource, params, headers)
response = conn.getresponse()
print(response.status, response.reason)
data = response.read()
print(data.decode('utf-8'));
Run Code Online (Sandbox Code Playgroud)
该HTTPResponse .read()方法返回一个bytes编码页面的元素(这是一个结构良好的UTF-8文档)在我停止使用Windows的IDLE GUI并使用Windows控制台之前,这似乎没问题.返回的页面有一个U + 2014字符(em-dash),打印功能可以在Windows GUI中很好地转换(我假定代码页1252),但不在Windows控制台中(代码页850).鉴于strict默认行为,我收到以下错误:
UnicodeEncodeError: 'charmap' codec can't encode character '\u2014' in position 10248: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)
我可以使用这个非常难看的代码修复它:
print(data.decode('utf-8').encode('cp850','replace').decode('cp850'))
Run Code Online (Sandbox Code Playgroud)
现在用一个替换有问题的字符" - " ?.不是理想的情况(连字符应该是一个更好的替代品),但足够我的目的.
我的解决方案中有几件我不喜欢的东西.
问题不在于emdash(我可以想到解决这个问题的几种方法),但我需要编写健壮的代码.我正在向页面提供来自数据库的数据,并且数据可以返回.我可以预见到许多其他相互矛盾的情况:'Á'U+ 00c1(在我的数据库中可能)可以转换为CP-850(西欧语言的DOS/Windows控制台编码)但不能转换为CP-437(美国的编码)英语,在许多Windows instalations中是默认的).
那么,问题是:
有没有更好的解决方案使我的代码与输出接口编码无关?
我试图从python发送一个简单的字典到json文件,但我一直得到"TypeError:1425不是JSON可序列化"的消息.
import json
alerts = {'upper':[1425],'lower':[576],'level':[2],'datetime':['2012-08-08 15:30']}
afile = open('test.json','w')
afile.write(json.dumps(alerts,encoding='UTF-8'))
afile.close()
Run Code Online (Sandbox Code Playgroud)
如果我添加默认参数,那么它会写入,但整数值将作为字符串写入json文件,这是不可取的.
afile.write(json.dumps(alerts,encoding='UTF-8',default=str))
Run Code Online (Sandbox Code Playgroud) 我对文本编码和字符集感到困惑.出于很多原因,我必须在即将开展的工作中学习非Unicode,非UTF8的东西.
我在电子邮件标题中找到"charset"一词,如"ISO-2022-JP",但在文本编辑器中没有这样的编码.(我环顾了不同的文字编辑.)
文本编码和字符集之间有什么区别?如果您能向我展示一些用例示例,我将不胜感激.
我尝试在OS X Lion中设置postgress,并发现没有正确设置LOCALE环境var.
这是设定的:
LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
Run Code Online (Sandbox Code Playgroud)
我期待UTF-8的东西.这是一个干净的OS X Lion设置,具有西班牙语.我什么都不动.
我不知道如何设置UTF-8.
在终端设置中,检查UTF-8并将LOCALE设置为打开,尽管不起作用.
我发现123,\d匹配1,3但没有2.我想知道是否\d匹配满足什么样的要求的数字?我在谈论Python风格的正则表达式.
Gedit中的正则表达式插件使用Python风格的正则表达式.我创建了一个文本文件,其内容为
123
Run Code Online (Sandbox Code Playgroud)
只有1和3正则表达式相匹配\d; 2不是.
通常对于其间没有其他字符的数字序列,只有奇数位数是匹配的,偶数位数不是.例如12345,匹配是1,3和5.
encoding ×10
python ×6
utf-8 ×3
json ×2
macos ×2
arraybuffer ×1
base64 ×1
decode ×1
encode ×1
gedit ×1
javascript ×1
latex ×1
python-2.x ×1
python-3.x ×1
regex ×1
sys ×1
terminal ×1
typeerror ×1
urlopen ×1