python json 编码_python乱码转中文

python json 编码_python乱码转中文python2.x版本的字符编码有时让人很头疼,遇到问题,网上方法可以解决错误,但对原理还是一知半解,本文主要介绍python中字符串处理的原理,附带解决json文件输出时,显示中文而非un

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

python2.x版本的字符编码有时让人很头疼,遇到问题,网上方法可以解决错误,但对原理还是一知半解,本文主要介绍 python 中字符串处理的原理,附带解决 json 文件输出时,显示中文而非 unicode 问题。首先简要介绍字符串编码的历史,其次,讲解 python 对于字符串的处理,及编码的检测与转换,最后,介绍 python 爬虫采取的 json 数据存入文件时中文输出的问题。
参考书籍:Python网络爬虫从入门到实践 by唐松

在python 2或者3 ,字符串编码只有两类 :

(1)通用的Unicode编码;
(2)将Unicode转化为某种类型的编码,如UTF-8,GBK;

1、计算机历史:

计算机只处理数字,因此处理文本时,必须转换成数字才行。
8位(bit)=1字节(byte)=256种不同状态=从000000到111111;
1GB=1024M=1024(1024kb)=1024(1024(1024b));

ASCII编码 是对应英文字符与二进制数字之间的关系;ASCII一共规定了128种,如大写字母A是65,即01000001;可见一字母一字节;

GB2312编码 简体中文常见的编码,两个字节代表一个中文汉字 ,理论上256*256个编码,即可表示65536种中文字;

各国编码不同,为了各国能扩平台进行文本的转换与处理,Unicode就被作为统一码或者单一码。Unicode编码通常是两个字节,unicode与ASCII编码的区别,在于unicode在ASCII编码前加了一个0,即字母A的ASCII编码为01000001,unicode编码即为0000000001000001;但英文字母其实只用一个字节就够了,unicode编码写英文时多了一个字节,浪费存储空间。因而unicode开发了通用转换格式(Unicode Transformation Format(UTF)),常见的有utf-8或者utf-16;

2、python字符编码

参考地址:https://www.jb51.net/article/139878.htm

(1)encode的作用是,将unicode对象编码成其他编码的字符串,str.encode(‘utf-8’),编码成UTF-8;(2)decode的作用是将其他编码的字符串转换成Unicode编码,str.decode(‘UTF-8’);

  • import chardet 查阅具体的编码类型,chardet.detect(str),但是str不能是unicode编码类型,但是该方法 不接受 本来已经是unicode的编码的 参数,会有TypeError: Expected object of type bytes or bytearray, got: <type ‘unicode’>错误;
  • 作为统一标准,unicode不能再被解码,如果UTF-8想转至其他非unicode,则必须(2)先decode 到unicode,在encode到其他非unicode的编码。

爬取网页时,可在F12 elements meta中查看网页编码方式,如图:

python json 编码_python乱码转中文

(2)中文,Python中的字典能够被序列化到json文件中存入json

with open("anjuke_salehouse.json","w",encoding='utf-8') as f:
    json.dump(all_house,f,ensure_ascii=False,sort_keys=True, indent=4);
    print(u'加载入文件完成...');

存储数据如图:

python json 编码_python乱码转中文

  • dump()的第一个参数是要序列化的对象,第二个参数是打开的文件句柄,注意文件打开open()时加上以UTF-8编码打开,在dump()的时候也加上ensure_ascii=False,不然会变成ascii码写到json文件中json.dump(all_house,f,ensure_ascii=False,sort_keys=True, indent=4)

json.dumps()/json.loads()等用法

json_str = json.dumps(all_house,ensure_ascii=False); #all——books 为列表、字典等python自带的数据结构,将其写成json
#print json_str; #[{"brokername": "王东宇"},{},{}]
new_dict = json.loads(json_str);#主要是读json文件时,需要用到
#print new_dict; #{u'house_area': u'95', u'build_year': u'2005'}
  • json.dumps() 是将一个Python数据结构转换为一个JSON编码的字符串,
    {“name”: “xiaoming”}

python json 编码_python乱码转中文

json.loads() 是将一个JSON编码的字符串(字典形式)转换为一个Python数据结构,{u’name’: u’xiaoming’}

python json 编码_python乱码转中文

dumps转化后键与值都变成了双引号,而在loads后变成python变量时,元素都变成了单引号,并且字符串前加多了个u
一般要求当要字符串通过loads转为python数据类型时,得外层用单引号,里面元素key和value用双引号。

  • sort_keys:根据key排序

dump与dumps的区别

  • dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw);dump将一个对象序列化存入文件,dump需要一个类似于文件指针的参数(并不是真的指针,可称之为类文件对象),可以与文件操作结合,也就是说可以将dict转成str存入文件中,如json.dump(all_house,f,ensure_ascii=False,sort_keys=True, indent=4)中的f表示一个数据待写入的json文件句柄;
  • dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw);而dumps(str)直接给的是str,也就是直接将字典转成str,无需写入文件,类似一个数据格式的转换方法,将python字符串转成json字典。
  • 所以dumps是将dict转化成str格式,loads是将str转化成dict格式。
    dump和load也是类似的功能,只是与文件操作结合起来了。

(3)中文存入txt

f=open('net_saving_data.txt','w',encoding='utf-8');
for item in all_house:
    # house_area=item['house_area'];
    # price=item['price'];
    output='\t'.join([str(item['house_area']),str(item['price']),str(item['build_year']),str(item['house_title'])]);
    f.write(output);
    f.write('\n');
f.close();

python json 编码_python乱码转中文

  • 在2.7.15版本的python中,提示错误TypeError: 'encoding' is an invalid keyword argument for this function,无法传入encoding的参数,但是在3.7版本可传入encoding=’utf-8’参数,即可对 txt进行中文写入。

!!NOTE

  • 中文写入txt、json文件是无非就是open()文件时,需要添加utf-8dump()时,需要添加ensure_ascii=False,防止ascii编码,但是刚开始因为python版本是2.7.15,不是3.7,导致存储不成功的时候,一直以为是代码的问题。所以最后发现就是版本的问题,也挺伤的。网上关于中文这个编码问题有很多,但是他们都没有强调python版本的问题!!!其他3.xx的版本没有试过。
  • 读取网页数据的时候,查看网页的charset,及chardet库对编码类型的查询,及时进行decode和encode的编码转化,应该就能避免很多编码问题了。其他的坑以后踩了再补吧。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/166773.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月1日 上午10:36
下一篇 2022年8月1日 上午10:36


相关推荐

  • pycharm误删文件无法恢复_pycharm不小心删除文件怎么恢复

    pycharm误删文件无法恢复_pycharm不小心删除文件怎么恢复

    2022年8月28日
    5
  • IP地址和子网划分例题详解

    IP地址和子网划分例题详解1、为什么要划分子网?IPv4地址如果只使用有类(A、B、C类)来划分,会造成大量的浪费或者不够用,为了解决这个问题,可以在有类网络的基础上,通过对IP地址的主机号进行再划分,把一部分划入网络号,就能划分各种类型大小的网络了。2、IPv4子网划分与聚合为了解决IPv4的不足,提高网络划分的灵活性,诞生了两种非常重要的技术,那就是VLSM(可变长子网掩码)和CIDR(无类别域间路由),把传统标准的IPv4有类网络演变成一个更为高效,更为实用的无类网络。关于VLSM和CIDR的介绍参考上篇子网掩码详解有

    2022年6月27日
    96
  • Linux【实操篇】—— 日志管理

    Linux【实操篇】—— 日志管理Linux 操作系统日志管理含实操案例

    2026年3月19日
    3
  • 水牛城66有看点不_acwing是什么

    水牛城66有看点不_acwing是什么给定一张 L 个点、P 条边的有向图,每个点都有一个权值 f[i],每条边都有一个权值 t[i]。求图中的一个环,使“环上各点的权值之和”除以“环上各边的权值之和”最大。输出这个最大值。注意:数据保证至少存在一个环。输入格式第一行包含两个整数 L 和 P。接下来 L 行每行一个整数,表示 f[i]。再接下来 P 行,每行三个整数 a,b,t[i],表示点 a 和 b 之间存在一条边,边的权值为 t[i]。输出格式输出一个数表示结果,保留两位小数。数据范围2≤L≤1000,2≤P≤50

    2022年8月9日
    7
  • redis面试必会6题经典(redis集合面试题)

    Redis面试题1、什么是Redis?.2、Redis的数据类型?3、使用Redis有哪些好处?4、Redis相比Memcached有哪些优势?5、Memcache与Redis的区别都有哪些?6、Redis是单进程单线程的?7、一个字符串类型的值能存储最大容量是多少?8、Redis的持久化机制是什么?各自的优缺点?9、Redis常见性…

    2022年4月16日
    367
  • 如何用gg修改器的偏移修改_gg修改器知道了代码怎么改

    如何用gg修改器的偏移修改_gg修改器知道了代码怎么改GG修改器正版是一款模拟游戏的辅助游戏,在这个修改器中我们可以尽情的使用模拟各种辅助游戏的方式,让我们可以在游戏中得到更多的游戏帮助,操作简单,并且包含了大量的游戏辅助能力,是一款非常好用的游戏辅助。GG修改器正版介绍1.玩家可以根据自己的想法随时随地修改游戏的值,修改位我们需要或者是最大值进行游戏;2.操作方法非常简单,让您在游戏中拥有真实的上帝体验,并体验游戏的乐趣和无限的能力;3.该软件不需…

    2025年9月13日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号