字符编码与文件处理

一.字符编码

由字符翻译成二进制数字的过程
 
字符--------(翻译过程)------->数字
 
这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之为字符编码。
 
字符编码的发展史
 
阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII
 
  ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符
 
    ASCII最初只用了后七位,127个数字,已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符)
 
    后来为了将拉丁文也编码进了ASCII表,将最高位也占用了
 
 
阶段二:为了满足中文,中国人定制了GBK
 
  GBK:2Bytes代表一个字符
 
 
  为了满足其他国家,各个国家纷纷定制了自己的编码
 
  日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里
 
 
阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。
 
于是产生了unicode, 统一用2Bytes代表一个字符, 2**16-1=65535,可代表6万多个字符,因而兼容万国语言
 
但对于通篇都是英文的文本来说,这种编码方式无疑是多了一倍的存储空间(二进制最终都是以电或者磁的方式存储到存储介质中的)
 
于是产生了UTF-8,对英文字符只用1Bytes表示,对中文字符用3Bytes
 
 
需要强调的一点是:
 
unicode:简单粗暴,所有字符都是2Bytes,优点是字符->数字的转换速度快,缺点是占用空间大
 
utf-8:精准,对不同的字符用不同的长度表示,优点是节省空间,缺点是:字符->数字的转换速度慢,因为每次都需要计算出字符需要多长的Bytes才能够准确表示
 
 
- 内存中使用的编码是unicode,用空间换时间(程序都需要加载到内存才能运行,因而内存应该是尽可能的保证快)
- 硬盘中或者网络传输用utf-8,网络I/O延迟或磁盘I/O延迟要远大与utf-8的转换延迟,而且I/O应该是尽可能地节省带宽,保证数据传输的稳定性。
用什么类型的字符编码存数据那么就用什么类型的字符编码解数据!
 

在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言,例如:

>>> print('包含中文的str')
包含中文的str

对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:

>>> ord('A')
65>>> ord('中')
20013>>> chr(66)
'B'>>> chr(25991)
'文'

如果知道字符的整数编码,还可以用十六进制这么写str

>>> '\u4e2d\u6587''中文'

两种写法完全是等价的。

由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes

Python对bytes类型的数据用带b前缀的单引号或双引号表示:

x = b'ABC'

要注意区分'ABC'b'ABC',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。

以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:

>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。

bytes中,无法显示为ASCII字符的字节,用\x##显示。

反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:

>>> b'ABC'.decode('ascii')
'ABC'>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'

要计算str包含多少个字符,可以用len()函数:

>>> len('ABC')
3>>> len('中文')
2

len()函数计算的是str的字符数,如果换成byteslen()函数就计算字节数:

>>> len(b'ABC')
3>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6>>> len('中文'.encode('utf-8'))
6

可见,1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。

在操作字符串时,我们经常遇到strbytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对strbytes进行转换。

由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

二Python对于文件处理的操作

打开文件的模式有:
  • r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
  • w,只写模式【不可读;不存在则创建;存在则清空内容】
  • x, 只写模式【不可读;不存在则创建,存在则报错】
  • a, 追加模式【可读;   不存在则创建;存在则只追加内容】
"+" 表示可以同时读写某个文件
  • r+, 读写【可读,可写】
  • w+,写读【可读,可写】
  • x+ ,写读【可读,可写】
  • a+, 写读【可读,可写】
 "b"表示以字节的方式操作
  • rb  或 r+b
  • wb 或 w+b
  • xb 或 w+b
  • ab 或 a+b
 注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
#r模式,默认模式,文不存在则报错
 
 
# f=open('a.txt',encoding='utf-8')
# # print('first-read:',f.read())
# # print('seconde-read: ',f.read())
#
# # print(f.readline(),end='')
# # print(f.readline(),end='')
#
#
# # print(f.readlines())
#
# # print(f.write('asdfasdfasdfasdfasdfasdf'))
#
# f.close()
 
 
 
 
#w模式,文不存在则创建,文件存在则覆盖
# f=open('a.txt','w',encoding='utf-8')
# f.write('1111111\n22222\n3333\n')
# # f.write('2222222\n')
#
# # f.writelines(['11111\n','22222\n','3333\n'])
#
# f.close()
 
 
#a模式,文不存在则创建,文件存在不会覆盖,写内容是追加的方式写
# f=open('a.txt','a',encoding='utf-8')
# f.write('\n444444\n')
# f.write('5555555\n')
# f.close()
 
 
#其他方法
# f=open('a.txt','w',encoding='utf-8')
# f.write('asdfasdf')
# f.flush() #吧内存数据刷到硬盘
# f.close()
# print(f.closed) #判断文件是否关闭
# f.readlines()
 
 
# print(f.name,f.encoding)
# print(f.readable())
# print(f.writable())
 
 
#
# f=open('c.txt','r',encoding='utf-8')
 
# print(f.read(3))
# print('first_read: ',f.read())
# f.seek(0)
# print('second_read: ',f.read())
 
#
# f.seek(3)
# print(f.tell())
# print(f.read())
 
 
 
 
# f=open('c.txt','w',encoding='utf-8')
# f.write('1111\n')
# f.write('2222\n')
# f.write('3333\n')
# f.write('444\n')
# f.write('5555\n')
# f.truncate(3)
 
 
# f=open('a.txt','a',encoding='utf-8')
#
# f.truncate(2)
 
#r w a; rb wb ab
# f=open('a.txt','rb')
#
# print(f.read())
# print(f.read().decode('utf-8'))
# f.close()
 
 
 
# f=open('a.txt','wb')
#
# print(f.write('你好啊'.encode('utf-8')))
# f.close()
上下文管理
我们经常在打开文件操作时忘记了一个小的操作--关闭文档
.colse()
我们用with as的模式来打开文档操作就可以避免这个小错误!
with open('a.txt','w') as f:

    pass
如何将文件的内容进行批量的修改:

read_f=open('a.txt','r',encoding='utf-8')  
 write_f=open('.a.txt.swp','w',encoding='utf-8')
with open('a.txt','r',encoding='utf-8') as read_f,\#将文件打开
open('.a.txt.swp','w',encoding='utf-8') as write_f:#并且再创建一个文件名为.a.txt.swp的文件
for line in read_f:
if 'alex' in line:                       #找到想要替换的内容

line=line.replace('alex','ALEXSB') #并且将旧的内容替换成新的内容存在.a.txt.swp的文件中

write_f.write(line)  #不符合条件的不动
os.remove('a.txt')  #将源文件删除
os.rename('.a.txt.swp','a.txt')  #将.a.txt.swp这个文件该成a.txt这样就实现了文件内容的批量修改!

 

python基础(三)----字符编码以及文件处理的更多相关文章

  1. Python全栈开发之路 【第三篇】:Python基础之字符编码和文件操作

    本节内容 一.三元运算 三元运算又称三目运算,是对简单的条件语句的简写,如: 简单条件语句: if 条件成立: val = 1 else: val = 2 改成三元运算: val = 1 if 条件成 ...

  2. python 基础之字符编码和文件处理

    一.字符编码 (1)计算机基础知识 (2)python 解释器执行py文件的原理 <1>python 解释器启动 <2>python解释器相当于一个文本编辑器,打开txt.py ...

  3. Python基础之字符编码,文件操作流与函数

    一.字符编码 1.字符编码的发展史 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit ...

  4. 第二篇.2、python基础之字符编码

    一 了解字符编码的知识储备 一 计算机基础知识 二 文本编辑器存取文件的原理(nodepad++,pycharm,word) #1.打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的 ...

  5. 第1章 Python基础之字符编码

    阅读目录 一.什么是字符编码 二.字符编码分类 三.字符编码转换关系 3.1 程序运行原理 3.2 终极揭秘 3.3 补充 总结 回到顶部 一.什么是字符编码 计算机要想工作必须通电,也就是说'电'驱 ...

  6. python基础_字符编码

    字符编码的历史 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII 阶段二:为了满足中文,中国人定制了GBK 阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的 ...

  7. python基础之字符编码(一)

    一.什么是字符编码 计算机要想工作必须通电,也就是说‘电’驱使计算机干活,而‘电’的特性,就是高低电压(高低压即二进制数1,低电压即二进制数0),也就是说计算机只认识数字 编程的目的是让计算机干活,而 ...

  8. Python 入门基础6 --字符编码、文件操作1

    今日内容: 1.字符编码 2.字符与字节 3.文件操作 一.字符编码 了解: cpu:将数据渲染给用户 内存:临时存放数据,断电消失 硬盘:永久存放数据,断电后不消失 1.1 什么是编码? 人类能够识 ...

  9. python开发基础之字符编码、文件处理和函数基础

    字符编码 为什么要有字符编码? 字符编码是为了让计算机能识别我们人写的字符,因为计算机只认识高低电平,也就是二进制数"0","1". 一个文件用什么编码方式存储 ...

  10. python基础4 ----字符编码

    python基础---字符编码 一.了解字符编码 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容 ...

随机推荐

  1. Java调优

    Java调优经验谈 对于调优这个事情来说,一般就是三个过程: 性能监控:问题没有发生,你并不知道你需要调优什么?此时需要一些系统.应用的监控工具来发现问题. 性能分析:问题已经发生,但是你并不知道问题 ...

  2. Android布局_表格布局TableLayout

    一.TableLayout概述 TableLayout表格布局模型以行列的形式管理子控件,每一行为一个TableRow的对象,当然也可以是一个View的对象 二.TableLayout的全局属性  1 ...

  3. ExtJS4.2.1自定义主题(theme)样式详解

    (基于Ext JS 4.2.1版本) UI组件 学习ExtJS就是学习组件的使用.ExtJS4对框架进行了重构,其中最重要的就是形成了一个结构及层次分明的组件体系,由这些组件形成了Ext的控件. Ex ...

  4. WPF MVVM 用户控件完成分页

    项目中经常会有分页查询的情况,在WPF中我们可以通过用户控件完成分页 一下为分页控件的页面代码, <UserControl x:Class="Foundation.UCtrl.Next ...

  5. HDU 1756 Cupid&#39;s Arrow 判断点在多边形的内部

    Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  6. iOS 登陆之界面设置

    1.界面构成 1.1. 效果图 1.2. 元素 背景图 用户名的输入框 密码的输入框 登陆按钮 忘记密码 用户注册 第三方登陆 两个分割线

  7. mysql基础篇-----mysql简介

    2017-04-19 一.mysql简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 ...

  8. navicat连接Oracle数据库

    记录一下navicat连接Oracle数据库过程: 一.根据自己版本去Oracle官网下载instantclient 地址:https://www.oracle.com/technetwork/top ...

  9. VM下载安装

    VM下载 VM是一款收费软件,要找有密钥的下载. 我的网盘 > 软件 > 常用电脑工具 > VM VM安装 参考链接中的安装步骤 http://blog.java1234.com/b ...

  10. Vue v-if 和 v-show

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...