我在学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. 阿里蒋晓伟谈计算引擎Flink和Spark的对比

    本文整理自云栖社区之前对阿里搜索事业部资深搜索专家蒋晓伟老师的一次采访,蒋晓伟老师,认真而严谨.在加入阿里之前,他曾就职于西雅图的脸书,负责过调度系统,Timeline Infra和Messenger ...

  2. Spring Security OAuth2 开发指南(非最新版本)

    请注意哈,本文翻译的时候,官网的的版本和本文翻译的时候是一一对应的. 但是官网已经更新文档和概念了,因此和本文翻译的就不在是同一个范围了. 因此我已经将标题修改为(非最新版本),各位老铁直接看官网就可 ...

  3. Image 缩略图

    方法一:通过调用Image对象的自带方法GetThumbnailImage()进行图片转换. /// <summary> /// 生成缩略图重载方法,返回缩略图的Image对象 /// & ...

  4. code snippet:依赖属性propa的小技巧

    很早之前就玩过VS里面的code snippet,相当方便. 今天在用prop自动属性代码时,无意中用了一下propa,然后就自动出来了依赖属性的代码片段,太方便了,尤其是对于WPF新手来说,比如我这 ...

  5. Xshel和Xftp免费版

    打开:https://www.netsarang.com/zh/free-for-home-school/ 然后填写自己的姓名与真实的邮箱即可.提交成功后,会将下载链接发送至刚才填写的邮箱里,发送的下 ...

  6. Oracle VirtualBox安装CentOS 8

    1.下载CentOS CentOS下载地址: https://wiki.centos.org/Download 这里以CentOS8为例 选择一个比较快的地址,这里以jdcloud mirror为例 ...

  7. Git 自救指南

    Git 虽然因其分布式管理方式,不完全依赖网络,良好的分支策略,容易部署等优点,已经成为最受欢迎的源代码管理方式.但是一分耕耘一分收获,如果想更好地掌握 git,需要付出大量的学习成本.即使在各种 G ...

  8. s3c2440裸机-代码重定位、清bss的改进和位置无关码

    1.代码重定位的改进 用ldr.str代替ldrb, strb加快代码重定位的速度. 前面重定位时,我们使用的是ldrb命令从的Nor Flash读取1字节数据,再用strb命令将1字节数据写到SDR ...

  9. APScheduler学习

    说明 APScheduler是一个 Python 定时任务框架,使用起来十分方便.提供了基于日期.固定时间间隔以及 crontab 类型的任务,并且可以持久化任务.并以 daemon 方式运行应用. ...

  10. [阅读笔记]EfficientDet

    EfficientDet 文章阅读 Google的网络结构不错,总是会考虑计算性能的问题,从mobilenet v1到mobile net v2.这篇文章主要对近来的FPN结构进行了改进,实现了一种效 ...