字符编码及文件操作
Posted linxidong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符编码及文件操作相关的知识,希望对你有一定的参考价值。
一、字符编
1.什么是字符编码:将人能识别的字符转换为计算机能识别的01二进制的过程就是字符编码,转换的规则就是字符编码表
2.常用的编码表:ASCII、GBK、Unicode、UTF-8
了解:编码表的发展史
1. ascii(ASCII):字母、数字、英文符号与计算机01标识符的对应关系
思考:如何将128个字符用01完全标签
二进制:11111111 => 255 => 1bytes(1字节) => 8个二进制位
2.中国:研究汉字与计算机01标识符的对应关系:gb2312 => GBK(***) => GB18030
日本:Shift_JIS
韩国:Euc-kr
3.万国码unicode
优点:统一用2Bytes表示所有的字符(任何国家都能使用)
例: a 0000 0000 0010 1010
缺点:
1.浪费存储空间
2.io次数增加,程序运行效率降低(致命)
现在的计算机
内存都是unicode
硬盘都是utf-8
(需要掌握的)
unicode的两个特点
1.兼容万国字符
2.其他国家编码的数据由硬盘读到内存的时候unicode与其他各个国家的编码都有对应关系
(必须掌握的)
数据由内存保存到硬盘
1.内存中的Unicode二进制数字 >>>编码(encode)>>> utf-8格式的二进制数据
硬盘中的数据由硬盘读到内存
1.硬盘中的utf-8格式的二进制数据 >>>解码(decode)>>> 内存中unicode格式的二进制数据
python2
(将py文件按照文本文件读入解释器)默认使用ASCII码(因为再开发python2解释器的时候 unicode还没有盛行)
python3
(将py文件按照文本文件读入解释器)默认使用utf-8
# 思考:unicode与utf-8什么关系
unicode:用2个字节来存储汉字,用2个字节来存储英文字母,占有空间较多,读取效率极高
utf-8:用3-6个字节来存储汉字,用1个字节来存储英文字母,占有空间较少,读取效率低
总结:内存都是按unicode存储数据,硬盘和cpu采用utf-8来存取数据
#“abc你好”
unicode与utf-8采用的是一张unicode编码表,utf-8是unicode编码表体现方式,变长存储数据。
变长优点:(大量数据都是以英文存在,所以utf-8空间更小)传输速度更快
3.编码操作:编码encode()、解码decode()
s = ‘123呵呵‘
n_b = bytes(s, encoding=‘utf-8‘)
print(n_b)
b = b‘123\xe5\x91\xb5\xe5\x91\xb5‘
n_s = str(b, encoding=‘GBK‘)
print(n_s)
在清楚原格式是字符串还是二进制时:
# 将u字符串编码成b字符串
print(u‘你好‘.encode(‘utf-8‘))
# 将b字符串解码成u字符串
print(b‘\xe4\xbd\xa0\xe5\xa5\xbd‘.decode(‘utf-8‘))
文件头:
# coding:utf-8
1.因为所有的编码都支持英文字符,所以文件头才能够正常生效
python2存数据的时候可以
x = u‘上‘ # 前面加个u 就以unicode格式存数据
print type(x)
print x
基于python2解释器开发的软件,只要是中文,前面都需要加一个u
为了的就是将python2(当你不指定文件头的时候,默认用ASCII存储数据,如果指定文件头那么就按照文件头指定的格式存储)
python3中字符串默认就是unicode格式的二进制数
补充:
1.pycharm终端用的是utf-8格式
2.windows终端用的是gbk
乱码:字符不能够正常显示 编码不一致
(******)
保证不乱码的关键:
文本文件以什么编码编的就以什么编码解码
八位二进制也叫8bit
8bit = 1Bytes
1024Bytes = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
二、文件操作
1.什么是文件?
操作系统提供给用户操作复杂硬件(硬盘)的简易接口
2.为什么要操作文件?
人或者应用程序需要永久的保存数据
3.如何用?
通过python代码操作文件
r 取消转义
f.open
r‘D:\day 06\db.txt‘,encoding=‘utf-8‘
文件打开的模式
r 只读模式
w 只写模式
a 追加模式
操作文件单位的方式
t 文本文件 t在使用的时候需要指定encoding参数 如果不指定 默认是操作系统的默认编码
b 二进制操作 一定不能指定encoding参数
1.应用程序要想操作计算机硬件 必须通过操作系统来简介的操作
f = open(r‘D:\day 06\db.txt‘,encoding=‘utf-8‘) # 向操作系统发送请求 打开某个文件
print(f) # f是文件对象
print(f.read()) # windows 操作系统默认的编码是gbk
f.read() # 想操作系统发请求 读取文件内容
f.close() # 告诉操作系统关闭打开的文件
print(f.read())
2.文件上下文操作
with open(r‘D:\day 06\db.txt‘,encoding=‘utf-8‘) as f: # f仅仅是一个变量名
print(f)
print(f.read())
mode 参数可以不写 不写的话默认是rt 只读文本文件 这个t不写默认就是t
with open(r‘D:\day 06\db.txt‘, mode=‘r‘ ,encoding=‘utf-8‘) as f:
print(f.readable()) # 是否可读
print(f.writable()) # 是否可写
print(f.read()) # 一次性将文件内容全部都出
with open(r‘D:\day 06\1.jpg‘, mode=‘rb‘) as f:
print(f.readable()) # 是否可读
print(f.writable()) # 是否可写
print(f.read()) # 一次性将文件内容全部都出
3.r模式再打开文件的时候 如果文件不在 直接报错(*****)
文件路劲可以写相对路径 需要注意该文件必须与执行文件在同一层文件下
with open(r‘db.txt‘, ‘r‘ ,encoding=‘utf-8‘) as f:
print(f.readable()) # 是否可读
print(f.writable()) # 是否可写
print(‘>>>>>:1‘)
print(f.read()) # 一次性将文件内容全部都出
print(‘>>>>>:2‘)
print(f.read()) # 读完一次之后 文件的光标已经再文件末尾了,再读就没有内容可读了
print(f.readlines()) # 返回的是一个列表 列表中的一个个元素对应的就是文本中一行行的内容
for i in f:
print(f)
print(f.readline()) # 只读取文件一行
print(f.readline())
print(f.readline())
print(f.readline())
4.w模式:一定要慎用
1.文件不存在的情况下,自动创建该文件
2.当文件存在的情况下 先会清空文件内容再写入
with open(r‘jason.txt‘, ‘w‘ ,encoding=‘utf-8‘) as f:
print(f.readable()) # 是否可读
print(f.writable()) # 是否可写
print(f.write(‘鸡哥张江第一大帅逼\n‘))
print(f.write(‘鸡哥虹桥第一大帅逼\n‘))
print(f.write(‘鸡哥上海第一大帅逼\n‘))
l = [‘鸡哥张江第er大帅逼\n‘,‘鸡哥虹桥第一大帅逼\n‘,‘鸡哥上海第一大帅逼\n‘]
print(f.writelines(l))
5.a模式
1.文件不存在的情况下,自动创建该文件
2.当文件存在的情况下 不清空文件内容,文件的光标会移动到文件末尾
with open(r‘jason.txt‘, ‘a‘ ,encoding=‘utf-8‘) as f:
print(f.readable()) # 是否可读
print(f.writable()) # 是否可写
f.write(‘鸡哥说:我是大帅逼\n‘)
4.游标
1. 如何使用游标:游标的相关方法
2. 游标相关的读写操作
3. 根据游标在大文件中取出多个指定位置的部分字节内容
seek(偏移量, 偏移位置)
偏移量以字节为单位
偏移位置:
0 -- 文件开头
1 -- 当前位置
2 -- 文件末尾
以上是关于字符编码及文件操作的主要内容,如果未能解决你的问题,请参考以下文章