首页 > temp > python入门教程 >
-
字符编码和python中的文件处理
字符编码与python文件处理
字符编码
1、常见的编码
ASCII: 美国人发明的,只编码英文字母和符号,1个字节。
GB2312: 中国人发明的,增加了中文汉字和符号,2个字节。
Unicode: 为了把所有语言都统一到一套编码里,一般是2个字节,生僻字4个字节,它只是规定了所有字符在内存里对应的方式,并没有规定怎么存储到硬盘。
UTF-8: 为了节省英文字符内存空间,UTF-8可变长编码,常用的英文字母被编码成1个字节,汉字通常是3个字节,生僻的字符编码成4-6个字节,它规定了存储到硬盘的编码格式。
2、关于字符编码需要记住的结论
(1)内存固定使用unicode,我们可以改变的是存入硬盘采用格式
英文+汉字-》unicode-》gbk
英文+日文-》unicode-》shift-jis
万国字符》-unicode-》utf-8
(2)文本文件存取乱码问题
存乱了:解决方法是,编码格式应该设置成支持文件内字符串的格式
取乱了:解决方法是,文件是以什么编码格式存如硬盘的,就应该以什么编码格式读入内存
(3)python解释器默认读文件的编码
python3默认:utf-8
python2默认:ASCII
指定文件头修改默认读文件的编码:
在py文件的首行写:
# coding:gbk
(4)保证运行python程序前两个阶段不乱码的核心法则:
指定文件头
# coding:文件当初存入硬盘时所采用的编码格式
(5)
python3的str类型默认直接存成unicode格式,无论如何都不会乱码
保证python2的str类型不乱码
x=u'上' 前面加个u
(6)了解
python2解释器有两种字符串类型:str、unicode
# str类型
x='上' # 字符串值会按照文件头指定的编码格式存入变量值的内存空间
# unicode类型
x=u'上' # 强制存成unicode
python中的文件处理
1、什么是文件?
文件是操作系统提供给用户/应用程序来操作硬盘的一种虚拟的接口。
2、为什么要用文件?
用户/应用程序通过操作文件可以将数据永久的保存到硬盘当中,即操作文件就是操作硬盘。
3、如何操作文件?
需要先了解的知识点
首先,我们需要了解一下关于文件的两种模式:
(1)控制文件读写内容的模式
t文本模式(默认的模式):
读写都是以str(unicode)为单位的
读写的必须是文本文件,图片或者视频等可能会报错
必须指定encoding=‘utf-8’
b二进制模式(bytes)
1.读写都是以bytes为单位
2.可以针对所有的文件
3,一定不能指定字符编码,即encoding参数
总结:
1.在操作纯文本文件方面,t模式确实帮我们省去了编码与解码的环节,b模式则还需要手动的进行编码和解码,所有纯文本下t模式更加方便。
2.但是对于那些非文本文件(如图片、视频等),就只能用b模式
(2)控制文件读写操作的模式
r只读模式
w只写模式
a只追加写模式
+:r+、w+、a+
具有详解之r模式:
1.r为open方法默认的操作模式,当文件不存在时会报错,当文件存在时文件的指针会跳到开始的位置
2.r模式会把文件所有的内容从硬盘读到内存
3.第二次读的时候,读不出任何东西,因为第一次读之后指针已经在文件末尾了
具有详解之w模式:
1.只写模式,当文件不存在时会自动创建文件,当文件存在时会清空文件数据,指针位于开始的位置
2.只有f.wirte()方法,只有写模式,wirte里有一个参数,是需要写入的数据
3.在w模式打开文件没有关闭文件的情况下,连续写入,新的内容总是跟在旧的之后
4.如果重新以w模式打开文件,则会清空文件内容
具有详解之a模式:
1.只追加写模式,在文件不存在时,会创建空文档,指针在开头;当文件存在时,文件指针会直接跳到末尾
具有详解之+模式:
1.+模式不能单独使用,需要配合r、w和a联合使用
open()方法
1.打开文件
f=open(r'aaa/a.txt',mode='rt')
参数说明:第一个参数指的是需要打开的文件路径
第二个参数mode指的是文件读写内容和操作的方式,默认是rt模式
# f的值是一种变量,占用的是pycharm应用程序的内存,f返回的是一个特殊的文件对象,open方法除了会返回一个文件对象给f。还会使操作系统打开一个文件。
2.操作文件(读写操作)
res = f.read() # 从头到尾全部读取出来
res = f.readline() # 一次读一行
res = f。readlines() # 结果为一个大列表
# read()里的可选n参数,在t模式下是指读出几个字符;在b模式下是这读出多少个字节。
# 操作文件实际是应用程序对文件的读写请求都是在向操作系统进行请求,然后操作系统控制硬盘把数据读入内存、或者写入硬盘
注意:read和readlines方法都是将内容一次读出,如果内容过大,很可能会导致内存溢出,因此,必须分多次读入,采用for或者while循环的方式。
res=f.writelines() #将列表中的内容写到文件中
f.flush()立马刷新,将内存的数据写到硬盘中
3.关闭文件
f.close() # 回收open时操作系统开辟的系统资源
with open()方法
with open()方法的主要特点是,你打开文件之后就不需要你在手动关闭文件占用的系统资源了,它会帮你自动关闭;同时,它还支持同时打开多个文件;
with open(‘a.txt’,mode='rt')as f1,open('b.txt',mode='rt') as f2:
res1=f1.read()
res2=f2.read()
注意:在以rt模式操作文件时,需要指定encoding=‘utf-8’!!!为什么呢?
因为,windows默认读文件的编码是gbk,Linux默认读文件的编码是utf-8
如果在opne打开文件的时候没有指定编码格式为utf-8时,pycharm默认存文件是utf-8,但是在读取文件时,由于没有指定编码格式,就会自动调用操作系统本身的默认的读编码格式!!!这是Windows系统下就会报错!;指定了编码格式,后面读取的时候会自动按照当时编码的格式进行解码。
4、文件指针移动
文件指针移动的单位都是以字节bytes为单位,只有在t模式下是指移动字符个数。
f.seek(n,模式)用来负责指针的移动,是以字节为单位。
参数说明:n指的是移动的字节个数
模式0:参照物是文件开头的位置
模式1:参照物是当前指针所在的位置
模式2:参照物是文件末尾的位置,指针是倒着移动(向左移),n为负值
强调:只有0模式可以在t下使用,其他都不行。
f.tell() #获取文件指针当前位置
出处:https://www.cnblogs.com/suncolor/p/16558186.html