文件读操作
以读的方式打开文件:
f=open('a.txt','r') # 默认会以 读的方式打开
con=f.read()
print(con)
打开文件还可以指定编码方式:
f=open('a.txt','r',encoding='utf-8') # 指定编码方式为UTF-8
con=f.read()
print(con)
注意: 在windows中文系统中,系统默认的编码方式为GBK,而Linux 系统的默认编码方式为UTF-8。 在python2中默认的字符串格式是bytes类型,而在python3中,使用的字符编码是Unicode类型,系统内存中都会使用unicode编码,只是在数据存储和传输的时候会将字符编码为utf-8或者GBK等格式。
读取全部的文件内容,默认会带换行符:
>>> f=open('a.txt','r')
>>> f.read()
'123\naaaa'
读取一行内容:
>>> f=open('a.txt','r')
>>> f.readline()
'123\n'
如果要去掉换行符,使用:
>>> f=open('a.txt','r')
>>> print(f.readline(),end='')
123
一次读取多行文件:
>>> f=open('a.txt','r')
>>> f.readlines()
['123\n', 'aaaa']
f.close()
close()
在对文件进行操作后,一定要关闭文件。
使用with
可以在对文件操作完成后自动关闭,可以同时对多个文件进行操作:
with open('a.txt','r',encoding='utf-8') as f, open('b.txt') as f1:
pass
以bytes方式读取文件
在使用open('a.txt','r',encoding=utf-8)
读取文件时,一般会指定字符的decode编码方式,对硬盘数据进行解码操作,因为字符从硬盘读取到内存要进行utf-8到unicode的decode操作,当然,我们也可以直接读取硬盘上的bytes:
f=open('a.txt','rb')
print(f.read())
f.close()
读取的并不是字符串,可以使用decode()函数解码:
s=f.read().decode('utf-8')
print(s)
文件写操作
写文件加入换行符\n
:
>>> f=open('a.txt','w')
>>> f.write('123\n')
4
>>> f.write('aaaa\n')
5
>>> f.write('cccc')
4
一次写入多行:
>>> f=open('a.txt','w')
>>> f.writelines(['a\n','b\n','c\n'])
>>> f.close()
对文件a.log文件进行修改:
import os
with open('a.log','r',encoding='utf-8') as f, open('.a.log.swap','w',encoding='utf-8') as write_f:
for line in f:
if 'old' in line:
line=line.replace('old','new')
write_f.write(line)
os.remove('a.log')
os.rename('.a.log.swap','a.log')
对文件追加内容
如果要对文件内容进行追加,使用a
操作:
f=open('a.txt','a',encoding='utf-8')
f.write('11111\n')
f.write('aaaaa\n')
使用 wb
模式对文件进行编辑,直接以bytes的方式写文件,如果是字符串需要编码:
f=open('a.txt','wb')
f.write('花园'.encode('utf-8'))
f.close()
文件读写
如果要在读文件的时候同时进行写操作,或者在写文件的时候进行读操作,那徐亚要使用r+
,w+
,a+
等模式:
f=open('a.txt','r+',encoding='utf-8')
print(f.read())
f.write('11111\n')
f.close()
文件复制
前面介绍了使用bytes的方式对文件进行读写,由于最终存储在硬盘上的都是以二进制的格式,所以在对任何文件进行拷贝操作时,都可以使用bytes读写的方式完成复制,比如非字符编码格式的图片,视频等:
with open('111.jpg','rb') as f1, open('222.jpg','wb') as f2:
for line in f1:
f2.write(line)
使用类似cp 命令的方式, 这里使用r%s
来避免Windows下对路径的转义:
import sys
if len(sys.argv) == 3:
with open(r'%s' %sys.argv[1],'rb') as f1, open(r'%s' %sys.argv[2],'wb') as f2:
for line in f1:
f2.write(line)
else:
print('USAGE: python file1 file2')
sys.exit()
文件的其他操作
read()
可以来读取字符和字节。
文件打开方式为文本模式时,代表读取的字符个数:
f=open('a.txt','r',encoding='utf-8')
print(f.read(3))
输出内容: 花园1
文件打开为b模式时,代表读取的字节数,汉字占用三个字节,数字和字母占用一个字节:
f=open('a.txt','rb')
print(f.read(3).decode('utf-8'))
输出内容: 花
光标移动
使用seek()
进行光标移动,tell
能显示当前光标所在的位置:
seek有三种移动方式0,1,2,其中1和2必须在b模式下进行。
0模式表示以文件开头为起始位置,0模式下可以在文本模式进行操作。
a.txt的内容为: 花园123
f=open('a.txt','r',encoding='utf-8')
print(f.read(3))
f.seek(3,0) # f.seek(0) 表示光标回到文件开头
print(f.tell())
输出:
花园1
3
1模式表示以光标的当前位置为起始位,第一个数字表示向后移动的字节数,一个汉字由3个字节:
f=open('a.txt','rb')
print(f.read(3).decode('utf-8'))
f.seek(4,1)
print(f.tell())
print(f.read())
输出内容:
花
7
b'23'
2 模式表示以文件末尾为起始位置,负数表示向前移动的字节数:
f=open('a.txt','rb')
print(f.read(3).decode('utf-8'))
f.seek(-2,2) # f.seek(0,2) 表示文件的末尾
print(f.tell())
print(f.read())
输出内容:
花
7
b'23'
编写一个实现类似tail -f filename 命令的程序:
import sys
import time
with open(r'%s' %sys.argv[2],'rb') as f1:
f1.seek(0,2)
while True:
line=f1.readline()
if line:
print(line)
else:
time.sleep(0.2)
truncate
是截断文件,文件的打开方式必须可写,也是以字节为单位进行截取,并且只能从文本开头开始截取:
with open('a.txt','r+') as f1:
f1.truncate(3)
文本操作后内容:
花