一、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