首页 > 代码库 > python 文件操作
python 文件操作
file 对象使用 open 函数来创建,下面说一下对文件的操作分三步:
1、打开文件获取文件的句柄,句柄就理解为这个文件
2、通过文件句柄操作文件,读取/写入文件内容
3、关闭文件。
注意:
文件打开模式有3种:
1. w 写模式,不能读取,只能写入,若文件不存在,则创建
2. r 读模式,不能写入,只能读取,而且文件必须存在;若不传文件打开模式,则默认是 r 读模式
3. a 追加模式,只能写入,在文件末尾添加内容
以w模式打开文件,写入内容,如下:
fp = open(‘file.txt‘,‘w‘) fp.write(‘hhh‘) #若以w模式打开存在的文件,会清空以前的文件内容,重新写入hhh
以r模式打开文件,读取文件内容,如下:
fp = open(‘file.txt‘, ‘r‘, encoding=‘utf-8‘) #windows 的默认字符集是gbk,需要设置为utf-8,encoding参数可以指定文件的编码 print(fp.read()) #读取文件内容,返回结果类型是字符串
以r模式打开不存在的文件,如下:
fp = open(‘a.txt‘, ‘r‘) #若打开的文件不存在,则报错:FileNotFoundError: [Errno 2] No such file or directory: ‘a.txt‘ print(fp.read())
以a模式打开不存在的文件,写入内容,如下:
fp = open(‘a.txt‘, ‘a‘) #写入不存在的文件名,a追加模式,若文件不存在则创建 fp.write(‘yiy‘) #在文件末尾添加内容
以下是文件常用的操作方法:
read()、readline()、readlines() 读取文件内容操作:
fp = open(‘file.txt‘, ‘a+‘) #a+模式,指针在文件最后的位置,需要将指针移动到初始文件,才能读取内容 fp.seek(0) #多次读取文件内容时,一定要将游标移动到初始位置,否则读取内容为空 print(fp.read()) #读取文件内容,返回的是字符串,指针移动到最后位置,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
fp.seek(0) #将指针移动到初始位置
print(fp.readlines()) #读取文件内容,返回的是一个列表,元素是每行的数据,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
fp.seek(0)
print(fp.readline()) #只读取文件内容的一行内容,返回的是字符串
大文件时,读取文件高效的操作方法:
用上面的read()和readlines()方法操作文件的话,会先把文件所有内容读到内存中,这样的话,内存数据一多,非常卡,高效的操作,就是读一行操作一行,读过的内容就从内存中释放了:
f = open(‘file.txt‘) for line in f: print(line) 这样的话,line就是每行文件的内容,读完一行的话,就会释放一行的内存
write()、writelines() 写入文件内容操作:
fp = open(‘file.txt‘, ‘a+‘) fp.write(‘2222‘+‘\n‘) #写文件时,只能写入字符串 fp.writelines([‘123\n‘, ‘456\n‘, ‘789‘]) #writelines可以将列表写入文件 fp.seek(0) print(fp.readlines()) #执行结果:[‘2222\n‘, ‘123\n‘, ‘456\n‘, ‘789‘]
flush()刷新文件内容缓冲,如下:
import time fp = open(‘file.txt‘, ‘w‘) #以w模式打开文件 fp.write(‘欢乐颂‘) #写入文件内容 fp.flush() #刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入 time.sleep(30) #sleep时间是30s fp.close() #关闭文件
tell()查看游标的位置:
fp = open(‘file.txt‘, ‘r+‘) print(fp.read()) #读取文件内容,执行结果:abcdefg print(fp.tell()) #查看游标所在位置,游标在最后一位 fp.seek(0) #将游标移动到初始位置 print(fp.tell()) #将游标移动到初始位置后,查看游标所在位置 fp.seek(2) #将游标移动到第2位 print(fp.tell()) #将游标移动到初始位置后,查看游标所在位置,游标在第二位 fp.seek(0, 2) #将游标移动到最末尾 print(fp.tell()) #将游标移动到初始位置后,查看游标所在位置,游标在最末尾
truncate(size)截取指定长度的内容:
fp = open(‘file.txt‘, ‘r+‘) #file.txt文件内容为abcdefg print(fp.tell()) #fp.truncate() #若没有指定size,则清空文件内容 fp.truncate(3) #传入size,表示从0开始截断3位字符,其余的清除 fp.seek(0) print(fp.read()) #执行结果为:abc
with用法,打开文件后,可以不手动关闭,文件不进行操作时,自动关闭,如下:
#with用法 open(文件名) as 别名,默认打开方式是 r模式 with open(‘file.txt‘) as fp: print(fp.read())
使用with打开多个文件,写法如下:
with open(‘file.txt‘) as fp, open(‘a.txt‘) as fw: for line in fp: print(line) print(fw.readlines())
修改文件的话,有两种方式,一种是把文件的全部内容都读到内存中,然后把原有的文件内容清空,重新写新的内容;第二种是把修改后的文件内容写到一个新的文件中:
第一种:
fp = open(‘file.txt‘, ‘a+‘) fp.seek(0) res = fp.read() #返回结果类型是字符串,指针在最后面 fp.seek(0) #将指针移动到初始位置 fp.truncate() #清空文件内容 new_res = res.replace(‘a‘, ‘hello‘) #将a字符串替换为hello,替换后为新的字符串内容 fp.write(new_res) #将替换后的内容写入文件
第二种:
import os fp = open(‘file.txt‘, ‘a+‘) fp.seek(0) fw = open(‘a.txt‘, ‘w‘) #打开第二个文件,专门写入替换后的文件内容 for line in fp: #直接循环文件对象,循环的是文件每一行的内容 new_res = line.replace(‘hello‘, ‘666‘) #将hello替换为666,替换后为新的字符串内容 fw.write(new_res) #将修改后的内容写入第二个文件 fp.close() #关闭文件,关闭后不能再进行读写操作 fw.close() os.remove(‘file.txt‘) #删除替换以前的文件 os.replace(‘a.txt‘, ‘file.txt‘) #将新文件名替换为已删除的文件名
import os with open(‘file.txt‘) as fp, open(‘a.txt‘, ‘w‘) as fw: for line in fp: new_res = line.replace(‘666‘, ‘hello‘) fw.write(new_res) os.remove(‘file.txt‘) os.replace(‘a.txt‘, ‘file.txt‘)
下表列出了 file 对象常用的函数:
序号 | 方法及描述 |
---|---|
1 |
file.close() 关闭文件。关闭后文件不能再进行读写操作。 |
2 |
file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
3 |
file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
4 |
file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False。 |
5 |
file.next() 返回文件下一行。 |
6 |
file.read([size]) 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
7 |
file.readline([size]) 读取整行,包括 "\n" 字符。 |
8 |
file.readlines([sizehint]) 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比sizhint较大, 因为需要填充缓冲区。 |
9 |
file.seek(offset[, whence]) 设置文件当前位置 |
10 |
file.tell() 返回文件当前位置。 |
11 |
file.truncate([size]) 截取文件,截取的字节通过size指定,默认为当前文件位置。 |
12 |
file.write(str) 将字符串写入文件,没有返回值。 |
13 |
file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
python 文件操作