系列文章目录
文章目录
一、文件操作的基本流程
1. 打开文件
-
使用
open
来打开文件,其返回值是文件类型,可以使用变量进行保存,之后就可以通过文件对象来操作文件。f = open('/home/hugh/a.txt') # 参数是文件路径
-
注意:因为在python中,反斜杠 \ 代表转义字符,如 \r 表示回车等。所以在windows系统下写文件路径可能会遇到一些问题:
open('C:\user\rom\a.txt') # 会报错,因为包含 \r 转义字符
在字符串前写一个 r ,代表原生字符串,就会忽略掉转义字符了(推荐)。
open(r'C:\user\rom\a.txt')
也可以直接写成反斜杠 / ,open会进行自动转换。
open('C:/user/rom/a.txt')
2. 操作文件
-
使用
read
来读取文件内容,它有一个可选参数,在t模式下表示读取的字符个数,在b模式下表示读取的字节个数。f.read(1024) # 从外存文件读取1024个字节(或字符)所有内容到内存中。
-
使用
write
来向文件写入内容,它不会立刻将内容写入外存文件,而是先保存在内存中。f.write('hello, hugh') # 将字符串写入内存中的文件对象。
-
其他操作:
f.readline() # 从文件读取一行,包括 "\n" 字符 f.readlines() # 从文件读取剩余的所有行,以列表形式返回 f.writelines(['hello,', 'hugh']) # 接收一个可迭代对象写入内存文件对象。 f.flush() # 将内存中的文件内容立刻写入外存中的文件中。
3. 关闭文件
-
使用
close
来关闭文件,回收操作系统资源(操作系统能同时打开的文件数是有限的)。f.close()
关闭文件之后就不能再执行读取操作了。
二、with语句
为了防止程序员再写代码时,忘记关闭文件对象,python提供了一种语法糖,称为 with语句,可以帮助程序员自动执行close方法,自动关闭文件对象。
-
定义:
# 开头写一个 with ,打开多个文件用逗号隔开 with open('a.txt') as f1, open('a.txt') as f2: # as后面写变量名,用于保存文件对象 res1 = f1.read() res2 = f2.read() # 不需要再写 f.close()
三、字符编码和模式
1. 指定字符编码
encoding参数就是解码时用到的编码格式,在linux和mac中默认为 utf-8,windows默认为gbk。
with open('a.txt', encoding='utf-8') as f:
pass
2. 文件打开模式
-
t - 文本模式(默认):
- 文件内容的读写都是以字符(unicode编码)为单位的。
- 只能用于打开文本文件。
- 可以指定字符编码:encoding=’utf-8’。
-
b - binary模式:
- 文件内容的读写都是以bytes为单位的。
- 可以用于打开所有文件(图片、可执行文件等都能打开)。
- 不能指定字符编码!
文件打开模式不能单独使用,必须和下面的文件操作模式连用:
with open('a.txt', mode='rt', encoding='utf-8') as f: # mode默认的模式就是rt pass
关于字符编码的内容,可以看作者的另一篇文章:字符编码的概念和发展史
3. 文件操作模式
-
r模式(默认):
只读模式,不能进行写操作。当文件不存在时,会报错。
-
w模式:
只写模式,不能进行读操作。当文件不存在时,会创建空文件。当文件存在时,会清空原有的内容!
注意:w模式在每次打开文件时都会清空原有内容。
-
a模式:
追加模式,不能进行读操作。当文件不存在时,会创建空文件。当文件存在时,会将新内容写到原有内容的最后面。
-
+模式:
与w、r、a模式连用:在原有基础上,使不能读的可以读,不能写的可以写,但原有特性不变,r+会在文件末尾追加内容。
-
x模式:
只写模式,与w模式的区别在于:当文件存在时,w模式会清空文件,x模式会报错。
举例:以文本模式向utf-8编码的文件中追加“hello,hugh”:
with open('hello.txt', mode='at', encoding='utf-8') as f:
f.write('hello,hugh')
4. b模式下的编码和解码
使用t模式操作文本文件,只需在打开文件时,指定文件所用的字符编码encoding。而在b模式下,不能在打开时指定字符编码,python解释器不知道文件的编码格式,所以在用b模式操作文本文件时,需要进行额外的操作。
-
编码:
使用encode方法,可以将字符串按照指定的编码格式进行编码。
with open('hello.txt', mode='wb') as f: f.write('hello,hugh'.encode('utf-8')) # 直接写入会导致乱码
-
解码:
使用decode方法,可以将读出的bytes类型,按照指定的编码格式解码为字符串。
with open('hello.txt', mode='rb') as f: res = f.read(1024).decode('utf-8') # 1024代表读1024个字节,不写就读出全部
四、文件指针
1. 文件指针的概念
文件指针也叫文件游标,它是用来指向文件内的一个位置。
比如,以r模式打开一个文件的时候,文件指针就指向了文件的最开头,这时使用read方法读取文件内容,指针就会向右(文件末尾方向)移动,将期间遇到的每一个字符都会被读出到内存中,直到移动到末尾,完成读取操作。
再次使用read读文件时,就读不出任何内容了,因为指针已经到了最后,没有内容可读了。
2. 移动指针
-
移动单位:
指针以字节为单位进行移动,只有在t模式下以字符为单位移动。
-
移动方法:
seek
方法用来移动指针,第一个参数是移动的单位数,正数代表右移,负数代表左移;第二个参数是基准:- 0:以文件开头为基准**(t模式只能使用此基准)**
- 1:当前指针所在位置为基准
- 2:以文件末尾为基准
f.seek(9, 0) # 以文件开头为基准,向右移动9个单位 f.seek(0, 2) # 移动到末尾
3. 获取指针位置
f.tell()
会返回文件指针当前的位置。