一、open模式
文件是日常编程中常用的操作,通常用于存储数据或应用系统的参数
语法:
open(filename,mode)
参数:
filename:要访问的文件名
mode:打开文件的模式
模式 |
说明 |
r |
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
w |
打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a |
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
rb |
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
wb |
以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
r+ |
打开一个文件用于读写。文件指针将会放在文件的开头。 |
w+ |
打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a+ |
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
rb+ |
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
wb+ |
以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab+ |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
二、常用函数
序号 |
方法及描述 |
1 |
关闭文件。关闭后文件不能再进行读写操作。 |
2 |
刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
3 |
返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
4 |
如果文件连接到一个终端设备返回 True,否则返回 False。 |
5 |
返回文件下一行。 |
6 |
从文件读取指定的字节数,如果未给定或为负则读取所有。 |
7 |
读取整行,包括 "\n" 字符。 |
8 |
读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 |
9 |
设置文件当前位置 |
10 |
返回文件当前位置。 |
11 |
从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。 |
12 |
将字符串写入文件,没有返回值。 |
13 |
向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行 |
三、常用的open模式
r:读模式,文件不存在时不会创建新文件,文件的指针将会放在文件的开头。默认模式
f = open('test.txt','r',encoding='UTF-8') #encoding是转码的意思,告诉解释器以UTF-8的编码格式。不指定的话默认是以操作系统的编码为准的 print(f.read()) #读所有,bytes--decode(utf-8)--str # print(f.read(5)) #读取5个字符串(b模式下单位是字节) # print(f.readlines()) #读所有,将结果放入列表中 # print(f.readline()) #一次读一行 # print(f.readline(),end='') #一次读一行,并指定结束符,默认结束符为\n f.close() #关闭文件 执行结果: 第一行 第二行 第三行
w:写模式,文件存在时则覆盖,文件不存在时创建新文件
f = open('aa.txt','w',encoding='UTF-8') f.write('第一行 \n') #换行需要添加换行符 f.write('第二行\n') # f.writelines('第三行\n','第四行\n') #写入一个字符串列表,换行需要添加换行符 #aa.txt中的内容: 第一行 第二行
a:追加模式。如果该文件已存在,文件指针将会放在文件的结尾,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入
f = open('aa.txt','a',encoding='UTF-8') f.write('追加的内容') # print(f.tell()) #打印光标当前位置,单位是字节 # f.flush() #使内存的内容刷新至文件 # f.seek(0) #a模式光标会定位在文件尾部,这里重新定位一下光标位置 # print(f.tell()) #输出光标位置为0 f.close() #aa.txt中的内容: 第一行 第二行 追加的内容
rb:二进制格式的读模式。文件指针将会放在文件的开头
f = open('test.txt','rb') print(f.read()) # print(f.read().decode('UTF-8')) #可以decode,输出字符串 f.close() #执行结果: b'\xe7\xac\xac\xe4\xb8\x80\xe8\xa1\x8c\r\n\xe7\xac\xac\xe4\xba\x8c\xe8\xa1\x8c\r\n\xe7\xac\xac\xe4\xb8\x89\xe8\xa1\x8c'
wb:二进制格式的写模式。文件存在时则覆盖,文件不存在时创建新文件
f = open('a.txt','wb') f.write('你好'.encode('UTF-8')) #字符串是Unicode编码,不能直接作为bytes类型写入,需要encode f.close()
ab:二进制格式的追加模式。如果该文件已存在,文件指针将会放在文件的结尾,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入
r+:读写模式。文件指针将会放在文件的开头。
w+:读写模式。文件存在时则覆盖,文件不存在时创建新文件
a+:读写模式。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写
rb+:二进制格式的读写模式。文件指针将会放在文件的开头
wb+:二进制格式的读写模式。文件存在时则覆盖,文件不存在时创建新文件
ab+:二进制格式的追加模式。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写
四、 with open语句
如果不用with语句,代码如下:
f = open('test.txt','r',encoding='UTF-8') print(f.read()) f.close()
这里有两个问题:一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。对于这种场景,Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。
with open('test.txt','r',encoding='UTF-8') as f: print(f.read())
五、File(文件) 方法
1、file.read([size])
从文件中读取指定的字节数,如果未给定或为负则读取所有。
语法:
fileObject.read();
参数:
size:从文件中读取的字节数
(文件打开方式为文本模式时,代表读取n个字符;文件打开方式为b模式时,代表读取n个字节)
返回值:
返回从字符串中读取的字节
实例:
#test.txt的内容如下: 第一行 第二行 第三行 #读取文件内容: f = open('test.txt','r',encoding='UTF-8') #print(f.read()) #读取所有 print(f.read(5)) #读取5个字符串 #输出结果如下: 第一行 第
2、file.seek(offset[, whence])
seek() 方法用于移动文件读取指针到指定位置
语法:
fileObject.seek(offset[, whence])
参数:
offset -- 开始的偏移量,也就是代表需要移动偏移的字节数
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起
(1和2必须在b模式下才能执行)
实例1:
f = open('test.txt','r',encoding='UTF-8') print(f.read()) #读取完所有内容,此时光标在文件最后 f.seek(3) #从文件开头位置往后偏移3个字节 print(f.read()) print(f.tell()) #打印光标当前位置 #返回的结果 第一行 第二行 第三行 一行 第二行 第三行 31
实例2:
f = open('test.txt','rb') print(f.read(3).decode('UTF-8')) #读取三个字节,此时光标在第三个字节的位置 print(f.tell()) f.seek(3,1) #从当前位置往后偏移3个字节 print(f.read().decode('UTF-8')) #返回的结果 第 3 行 第二行 第三行
实例3:
f = open('test.txt','rb') f.seek(0,2) #从文件末尾位置偏移0个字节,就是文件最后 print(f.tell()) f.seek(-3,2) #从文件末尾位置往前偏移3个字节 print(f.tell()) print(f.read().decode('UTF-8')) #返回的结果 31 28 行
3、file.truncate([size])
truncate() 方法用于从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小
语法:
fileObject.truncate( [ size ])
参数:
size -- 可选,如果存在则文件截断为 size 字节
实例:
f = open('test.txt','r+',encoding='UTF-8') #读写模式 f.truncate(6) #截取6个字节 print(f.read()) #返回的结果 第一
六、 小程序
1、文件拷贝
with open('test.txt','r',encoding='UTF-8') as read_f,open('test2.txt','w',encoding='UTF-8') as write_f: for line in read_f: #循环读取test.txt文件内容 write_f.write(line) #写入到test2.txt
2、图片拷贝
import sys source_file,target_fiel=sys.argv[1],sys.argv[2] #传参赋值 with open(source_file,'rb') as read_f,open(target_fiel,'wb') as write_f: #二进制模式 for line in read_f: write_f.write(line) #用法:python copy.py source.jpg target.jpg #适用于任何类型文件的拷贝
3、仿tail程序
import sys import time file = sys.argv[2] with open(file,'rb') as f: #下面要用到seek()方法的whence,所以用b模式 f.seek(0,2) while True: line = f.readline() if line: print(line.decode('UTF-8')) else: time.sleep(0.2) #用法:python tail.py -f xxx.log
4、文件修改
import os with open('test.txt','r',encoding='utf-8') as read_f,open('.test.txt.swap','w',encoding='utf-8') as write_f: for line in read_f: if line.startswith('第三行'): line='这是修改后的第三行' write_f.write(line) os.remove('test.txt') os.rename('.test.txt.swap','test.txt')
来源:https://www.cnblogs.com/yanmj/p/7155310.html