前言
上一篇文章 python学习——【第十四弹】 中学习了python中的包与内置模块,这篇文章接着学习python中的文件读写。
编码方式
在学习文件读写之前,我们先了解下python当中的编码方式:
- 字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。
- 字符(Character)计算机中使用的字母、数字、字和符号,比如'A'、'B'、'$'、'&'等。
- 一般在英文状态下一个字母或字符占用一个字节,一个汉字用两个字节表示。
- ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。
- UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。
- Unicode 编码中,一个英文为一个字节,一个中文为两个字节。
- 符号:英文标点为一个字节,中文标点为两个字节。例如:英文句号 . 占1个字节的大小,中文句号 。占2个字节的大小。
- UTF-16 编码中,一个英文字母字符或一个汉字字符存储都需要 2 个字节(Unicode 扩展区的一些汉字存储需要 4 个字节)。
- UTF-32 编码中,世界上任何字符的存储都需要 4 个字节。
python的解释器使用的Unicode(内存),python文件(.py)在磁盘上使用的是UTF-8(外存)。
python3中默认使用的是UTF-8的编码;
我们可以使用sys模块中的getdefaultencoding()获取默认的编码格式
import sys
print(sys.getdefaultencoding())
# utf-8
在计算机内存中,统一使用的是Unicode编码,当需要保存在硬盘或者是需要传输的时候,就会转换为UTF-8编码:
当我们用记事本进行编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里;编辑完成后进行保存,会再将Unicode转换为UTF-8保存到文件中。
我们看用python文件用记事本打开,然后另存时默认的编码类型:
而记事本的保存的默认编码格式是ANSI,(准确说,并不存在哪种具体的编码方式叫做ANSI,它只是一个Windows操作系统上的别称而已。在中文简体Windows操作系统上,ANSI就是GBK),如果我们直接用python去新建一个txt文本文档的文件,由于编码格式的不兼容,因此会发生乱码:
为了避免编码格式不兼容的问题,我们可以在代码中进行修改写入数据的编码格式为UTF-8:
f = open("编码.txt", "w",encoding='UTF-8')#将输入数据的编码格式改为UTF-8
f.write("你好!世界!")
f.close()
想要对编码格式多加了解的伙伴,可以参考这篇文章:点击查看。
常见的文件打开模式
文件的类型:
按照文件数据的组织形式,文件分为以下两个大类:
文本文件:存储的是普通“字符”文本,默认为Unicode字符集,可以使用记事本程序打开
二进制文件: 把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开,如图片文件(.png .jpeg等)以及 .doc文档等。
常见的打开模式:
r 以只读的模式打开文件,文件的指针将会放在文件的开头
w 以只写的模式打开文件 如果文件不存在就创建,如果文件存在就覆盖文件的原有内容,文件指针在文件的开头
a 以追加的模式打开文件,如果文件不存在就创建,文件指针在文件开头;如果文件存在,则在文件末尾追加内容,文件指针在源文件末尾
b 以二进制的方式打开文件 不能单独使用,需要与共它模式一起使用 如 rb(只读的方式打开二进制文件)或者wb(只写的方式打开二进制文件)
+ 以读写的方式打开文件,不能单独使用,需要和其他模式一起使用 比如 a+
需要注意的是:我们在进行对文件的读写操作时,代码最后要对文件进行close()关闭操作:close()操作把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源。
r 只读
以只读的模式打开该文件
file_r=open('a.txt','r')
print(file_r.read())#读取文件内容
file_r.close() #关闭文件 只要我们打开了文件,在代码结束时就要写上关闭文件的代码,以释放资源。
说到只读,这里有文件对象的几种常用方法,我们可以用只读的方式来查看各个方法的功能:
read([size]) 从文件中读取size个字节或者是字符的内容的返回,如果省略[size]的话,就会从文件的开头一次性读取到文件的末尾;
readline() 从文本文件中读取第一行内容;
readlines() 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表中返回;
seek(offest,[whence]) 把文件指针移动到新的位置,offset表示相对于whence的位置;
tell() 返回文件指针的当前位置;
flush() 把缓冲区的内容写入到文件中,但是不关闭文件
我们先读取a.py中的全部内容:
然后用读取文件对象的常用方法读取a.txt :
# read([size]) 从文件中读取size个字节或者是字符的内容的返回,如果省略[size]的话,就会从文件的开头一次性读取到文件的末尾
file_r=open('a.txt','r')
print(file_r.read(5)) #返回5个字节
file_r.close()
print('------------------------\n')
# readline() 读取文本中的第一行内容
file_rl=open('a.txt')
print(file_rl.readline())
file_rl.close()
print('------------------------\n')
# readlines() 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表中返回
file_rls=open('a.txt','r')
print(file_rls.readlines())
file_rls.close()
seek()
seek()的括号中输入字节数,文件的指针就会从文件开头往后移动几个字节
file_seek=open('a.txt','r')
file_seek.seek(2)
print((file_seek.read()))
file_seek.close() #llo world
a.txt:
需要注意:如果我们需要读取的字节数必须是正确的字节数;比如在读取汉字时,如果是输入2,而
UTF-8的编码中一个汉字是3个字节,会导致程序报错。
tell()
返回文件指针的当前位置
file=open('a.txt','r')
file.seek(2)
print(file.read())
print(file.tell()) #返回指针当前所在的位置
file.close()
flush()
把缓冲区的内容写入到文件中,但是不关闭文件
file=open('b.txt','a')#采用追加的方式打开文件
file.write('hello')
file.flush() #把缓冲区的内容写入到文件中,但是不关闭文件
file.write('world')
file.close()
但是我们将flush()和close()区分开来,flush()不会关闭该文件,也就是说可以在flush()代码执行之后可以继续往文件里写入数据;但是close()执行后就不能再往文件中写入数据了,否则会报错。
w 只写
以只写的模式打开文件 ,如果文件不存在就创建,如果文件存在就覆盖文件的原有内容,文件指针在文件的开头:
只读的模式打开a.txt,我们发现a.txt文件中的原有内容被覆盖。
这里我们用到了文件对象的写入方法 : write(str) 将字符串str内容写入文件
还有一种常用的文件对象的写入方法:
writelines(s_list) 将字符串列表s_list写入文本文件,并且不添加换行符
s_lis1=['hello','world','hello','python']
file_wl=open('a.txt','w')
file_wl.writelines(s_lis1)
file_wl.close()
使用该方法需要注意的是写入的必须是字符串列表,如果不是字符串列表会报类型错误:
a 以追加的模式打开文件
以追加的模式打开文件,如果文件不存在就创建,文件指针在文件开头;如果文件存在,则在文件末尾追加内容,文件指针在源文件末尾。
file_a=open('a.txt',"a")
file_a.write('python') #写入'python'
file_a.close()
b 打开二进制的文件
二进制文件: 把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开,如图片文件(.png .jpeg等)以及 .doc文档等。
b 不能单独使用,需要与共它模式一起使用: 如rb或者wb
# 打开读取源文件
src_file=open('befor.png','rb')
# 打开写入目标文件
target_file=open('after.png','wb')
# 将从源文件中读取的文件写入目标文件
target_file.write(src_file.read())
# 将目标文件和源文件关闭
target_file.close()
src_file.close()
每篇一语
不要在夕阳西下时幻想,要在旭日东升时努力。
如有不足,感谢指正!