我在学python的open函数时,发现在pycharm里新建一个file_name.txt文本文件,输入中文保存。再用open(file_name,'r+')打开,再去读写时出现了一些问题。利用Notepad和EditPlus进行多轮控制变量测试后,总结如下:

1、当原文件为utf8编码格式,且不包含中文,则对其进行读操作,正常;对其进行写操作(非中文),正常,文件编码格式不变;
当写入中文字符时,文件编码格式变为gbk,此时pycharm中的文件会将你输入的中文显示为16进制数,并会提示你用gbk编码reload文件。
2、当原文件为utf8编码格式,若包含中文,此时对其进行读操作,则可能报错UnicodeDecodeError,也可能不报错。是否报错跟中文内容有关。
写入中文情况与1相同。 如,新建一个文件file4.txt,里面写入"你好"两个汉字,然后去读它:

结果为:

为什么是 " 浣 犲 ソ " 这三个陌生的玩意呢?查看“你好”的utf8编码16进制表示:

再查看这三个字符的GBK编码16进制表示:

瞬间明白了:open函数用GBK解码了被UTF-8编码的file4文件。前者用两个字节表示一个汉字而后者用三个。

把“你好”换成“中国”再试一次:报错了!

因为“中国”的编码前两个字节E4B8根本就没有对应的GBK编码字符。

open的encoding默认为'gbk',可将其改为'utf-8'.

改后也可能会出错!

如:file4输入中英混合的,hello中国

再对其进行覆盖写:

其utf8 16进制表示为:

68 65 6C 6C 6F     E4 B8 AD    E5 9B BD
覆盖写入"天青色"后:

E5 A4 A9  E9 9D 92  E8 89 B2  9B BD

还剩个9BBD找不到对应的字符,自然就报错了:


完。

补充点编码知识:

Unicode编码其实只是个编号,把全球的字符用唯一的16进制编号表示出来,最多可表示1114111个,即10FFFF。他没有规定具体怎么存储到计算机硬盘中。而UTF-8就是具体编码的体现。

如:“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间, 使用3字节模板: 1110xxxx 10xxxxxx10xxxxx。将0x6C49写成二进制是: 0110 1100 0100 1001,用这个比特流依次代替模板中的x,得到:

11100110 10110001 10001001, 即E6 B1 89。


关于python内open函数encoding编码问题的更多相关文章

  1. Python内置函数(12)——str

    英文文档: class str(object='') class str(object=b'', encoding='utf-8', errors='strict') Return a string  ...

  2. Python内置函数(61)——str

    英文文档: class str(object='') class str(object=b'', encoding='utf-8', errors='strict') Return a string ...

  3. Python 内置函数笔记

    其中有几个方法没怎么用过, 所以没整理到 Python内置函数 abs(a) 返回a的绝对值.该参数可以是整数或浮点数.如果参数是一个复数,则返回其大小 all(a) 如果元组.列表里面的所有元素都非 ...

  4. 【转】python 内置函数总结(大部分)

    [转]python 内置函数总结(大部分) python 内置函数大讲堂 python全栈开发,内置函数 1. 内置函数 python的内置函数截止到python版本3.6.2,现在python一共为 ...

  5. python内置函数,匿名函数

    一.匿名函数 匿名函数:为了解决那些功能很简单的需求而设计的一句话函数 def calc(n): return n**n print(calc(10)) #换成匿名函数 calc = lambda n ...

  6. python 内置函数总结(大部分)

    python 内置函数大讲堂 python全栈开发,内置函数 1. 内置函数 python的内置函数截止到python版本3.6.2,现在python一共为我们提供了68个内置函数.它们就是pytho ...

  7. Python之路(第八篇)Python内置函数、zip()、max()、min()

    一.python内置函数 abs() 求绝对值 例子 print(abs(-2)) all() 把序列中每一个元素做布尔运算,如果全部都是true,就返回true, 但是如果是空字符串.空列表也返回t ...

  8. Python之路Python内置函数、zip()、max()、min()

    Python之路Python内置函数.zip().max().min() 一.python内置函数 abs() 求绝对值 例子 print(abs(-2)) all() 把序列中每一个元素做布尔运算, ...

  9. Python入门之 Python内置函数

    Python入门之 Python内置函数 函数就是以功能为导向,一个函数封装一个功能,那么Python将一些常用的功能(比如len)给我们封装成了一个一个的函数,供我们使用,他们不仅效率高(底层都是用 ...

随机推荐

  1. Windows CLI命令

    目录 Windows CLI命令 1.背景 2.netstat 罗列端口号占用情况 3.telnet 远端IP的某个端口号 Windows CLI命令 1.背景 在Windows操作系统下开发,需要用 ...

  2. Access the Security System in Code 在代码中访问安全系统

    This lesson will guide you through using the static SecuritySystem class to check whether or not a u ...

  3. 版本控制工具——Git常用操作

    本文引自:https://juejin.im/post/5c206f1bf265da615114c15a

  4. Logo(图片)作为报表水印的解决方法

    概述 在<像 word 一样增加水印功能>中,已经介绍了如何在润乾报表中增加文字水印功能,包括了静态及动态水印.水印功能将标识信息嵌入到报表载体后,使得信息安全.版权保护有了更有效的方法. ...

  5. Assets.xcassets:-1: Failed to find a suitable device for the type IBSimDeviceTypeiPad2x

    Assets.xcassets:-1: Failed to find a suitable device for the type IBSimDeviceTypeiPad2x 不知道assets发生了 ...

  6. Android Studio 3.0+ Record Espresso Test 自动化测试

    准备工作 1.将android studio 版本升级到3.0+2.百度下载夜神模拟器 夜神模拟器的基本设置 PS:以上就是夜神模拟器的基本设置 Android Studio 连接夜神模拟器 //夜神 ...

  7. git命令行的颜色配置

    Git颜色branch,diff,interactive,status配置,git终端配置颜色,git命令行高亮 Git默认的输出是单一颜色的,感觉很不容易阅读,Git支持用多种颜色来显示其输出的信息 ...

  8. RAC环境下修改字符集

    跟单实例多少有点区别ORACLE 11g RAC 两节点第一步 查看字符集PRIMARY-SYS@mydb2>select userenv('language') from dual; USER ...

  9. sql server2017开启远程连接

    1.安装完SQL server2017之后,选择SQL 身份验证登录,可以先用windows身份验证登录把密码更改好了,然后服务器右键重新启动 ,再断开连接 ,选择SQL身份验证登录验证,关闭SQL ...

  10. python检查字典元素是否存在类似php中isset()方法

    PHP中isset()方法来检查数组元素是否存在,在Python中无对应函数,在Python中一般可以通过异常来处理数组元素不存在的情况,而无须事先检查 Python的编程理念是“包容错误”而不是“严 ...