python2和3在处理字符串上的区别
python2和3在处理字符串上的区别
python2和python3对于字符串的处理有很大的区别
熟悉了python2的写法用python3时真的会遇到很多问题啊……
区别
python2中有一种类型叫做unicode型,例
type(u"a") => str型
type("a".decode('utf8')) => unicode型
两者返回的类型都是unicode型
而在python3中,所有的字符串都是unicode,所以就不存在单独的unicode型,全部都是字符串型
type(u"a") => str型
type("a".decode('utf8')) => 报错,python3不能这样写
但是python3中多处一种字符串
type(b'132') => byte型
而在python2中这样写就会报错
所以显而易见,decode和encode的使用也会有很大的区别
python2中的decode是将str型转换为unicode型
python3中的decode是将byte型转换为str型
使用
在使用python3写爬虫时,有时候会遇到这样的错误
'gbk' codec can't encode character '\u30fb' in position 0: illegal multibyte sequence
遇到这样的错误就和上面的编码问题连系起来了
你会发现,明明自己设置的编码是utf8,怎么会报一个gbk的错误??
这个问题可能会在两个地方出现(输出时,写入文件时),其实这里设置的编码并没有问题,问题出在python3的字符串中,像上面说的,python3默认所有字符串都是unicode型,在面对字符串时,会首先按照unicode解析,自然会报错
那么,我们来转换一下编码(假设a是一个gbk编码的数据流)
"a".decode('gbk')
将字符串按照gbk规则解码
会发现依旧报错,明明已经改为gbk了啊……不着急,再进行一次
"a".decode('gbk').encode('utf8').decode('utf8')
为什么写的这么长……就像上面说的,decode是将byte型转为str型,而encode是将str型转换为byte型,所以再进行一次encode,decode就能够使得字符串转换编码格式
但是当你输出时,你会发现还是有问题
解决
我们回到开始
不输出我们想要的字符串,发现没有问题……问题出在哪?
没错,是print(),print在输出时会默认其中的字符时unicode编码的字符串,而我们输入了一个gbk编码的字符串,所以就会出错,所以,解决方法就是,不使用print……
但是print的使用有时候是不可避免的,所以在decode时加上一个ignore
"a".decode('gbk',errors='ignore')
此外,在打开或写入文件时遇到的话,就需要加上encoding参数
with open("1.txt",'r',encoding='utf8') as a:
python2和3在处理字符串上的区别的更多相关文章
- python 字节字符串上的字符串操作
问题:想在字节字符串上执行普通的文本操作(比如移除,搜索和替换). 解决方案 1)字节字符串同样也支持大部分和文本字符串一样的内置操作.比如: >>> data = b'Hello ...
- JavaScript 字符串(上)
JavaScript 字符串(上) 三种引号 字符串可以包含在单引号.双引号或反引号中 //用法 let single = 'Single quotation mark'; //单引号 let dou ...
- Appium和Robotium在文字输入上的区别
Appium和Robotium在文字输入上的区别 Appium和Robotium在对文本框进行输入时有一定的区别: Appium在输入文字时需要调用系统键盘 Robotium在输入文字是根本不需要 ...
- WITH RECOMPILE 和 OPTION(RECOMPILE) 使用上的区别
在考虑重编译T-SQL(或者存储过程)的时候,有两种方式可以实现强制重编译(前提是忽略导致重编译的其他因素的情况下,比如重建索引,更新统计信息等等), 一是基于WITH RECOMPILE的存储过程级 ...
- iPhone与iPad在开发上的区别
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- C# 引用类型与值类型在编码上的区别
一.引入类型与值类型简介 值类型:直接存放于栈中,取的时候是直接取得值.值类型继承自System.ValueType.(自定义对象) 引用类型:存在于托管堆中,取的时候是从栈取该对象的地址,然后用这个 ...
- Java进阶(二十一)java 空字符串与null区别
java 空字符串与null区别 1.类型 null表示的是一个对象的值,而并不是一个字符串.例如声明一个对象的引用,String a = null ; ""表示的是一个空字符串, ...
- AndroidStudio2.2 Preview3中NDK开发之CMake和传统 JNI在目录结构和配置文件上的区别(转载)
自从AndroidStudio更新到2.2,就有了CMake和传统JNI两种开发NDK的方法,主要就是在目录结构和build.gradle上的区别,下面我们将分别介绍目录区别和build.gradle ...
- Odoo9以后的社区版本和企业版功能上的区别
Odoo9以后的社区版本和企业版除了授权模式的区别外,整理功能上的区别 透过功能设置菜单整理的区别如下,主要功能模块. 未包括所有模块,毕竟模块太多了. 以下是企业版有,而社区版没有的功能.
随机推荐
- luogu P2331 [SCOI2005]最大子矩阵
传送门 \[\huge\mathit{warning}\] \[\small\text{以下说明文字高能,请心脏病,,,,,,人士谨慎观看,请未成年人在家长陪同下观看}\] 皮这一下很开心 其实是代码 ...
- 第18月第20天 tensorflow安装
1. # Mac OS X $ sudo easy_install pip # Mac OS X, CPU only: $ sudo easy_install --upgrade six $ sudo ...
- d2-admin中那些不错的技巧
d2-admin基于vue-cli3 路由相关 刷新路由,参照官方 组件内的守卫 但是搞不明白为何加了句 render:h => h() { path: 'refresh', name: 'r ...
- ubuntu + usb转RS232驱动
1. 购买USB转串RS232/485/422 如果你的电脑有串口的话,就不用买啦,我的台式机有串口,把USB转串的线插上之后,unbuntu就不支持了.(自己有嘛) 就是输入 ls /dev/tt ...
- emmc基础技术8:操作模式3-interrupt mode
1. 前言 eMMC总线操作包含: boot mode, device identification mode interrupt mode data transfer mode 本文主要描述inte ...
- Python-HTML CSS 练习
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Linux 快速删除已输入的命令
从输入模式到命令模式: 按”:“到最后一行,再按ctrl+z 就好了 history 显示命令历史列表 ↑(Ctrl+p) 显示上一条命令 ↓(Ctrl+n) 显示下一条命令 !num 执行命令历史列 ...
- 【linux】tcpdump抓包
tcpdump -i eth0 host 192.168.11.22 -w ./target.cap 上面指令,抓取eth0中与192.168.11.22相关的流量,保存到target.cap中
- Laravel 返回数据库中的随机一行数据
最佳方式 $total = Book::count() - 1; $skip = mt_rand(0, $total); $item = Book::select('name', 'author_id ...
- poj2019 二维RMQ模板题
和hdu2888基本上一样的,也是求一个矩阵内的极值 #include<iostream> #include<cstring> #include<cstdio> # ...