python文件操作
在计算机中,硬盘借助文件系统才能存取数据。在python里,文件是一种类型对象,类似于数据类型,包括文本的、图片的、音频的、视频的等等。python提供了方法来操作文件。
文件处理流程
打开文件,指定打开文件的模式,获取文件的句柄
之后通过句柄对文件进行操作
关闭文件
打开文件
文件句柄 = open('文件路径', '模式')
这里文件路径可以是相对路径也可以是绝对路径:
相对路径
f = open('a.txt','r')
a.txt文件在当前py文件同目录下,直接打开。
绝对路径
f = openr(r'C:\Python\a.txt','r')
a.txt文件绝对路径输入,前面加r指定后面内容都无特殊意
义,也就是后面内容无需转义'\'这个符号
打开文件有如下模式:
默认就是r模式
模式 | 描述 |
---|---|
r | 以读方式打开文件,可读取文件信息。 |
w | 以写方式打开文件,可向文件写入信息。如文件存在,则清空该文件,再写入新内容 |
a | 以追加模式打开文件(即一打开文件,文件指针自动移到文件末尾),如果文件不存在则创建 |
r+ | 以读写方式打开文件,可对文件进行读和写操作。 |
w+ | 消除文件内容,然后以读写方式打开文件。 |
a+ | 以读写方式打开文件,并把文件指针移到文件尾。 |
b | 以二进制模式打开文件,读取到的内容是字节类型,而不是以文本模式。该模式只对Windows或Dos有效,类Unix的文件是用二进制模式进行操作的。 |
操作文件
read \readline \readlines
read:如果指定了参数size(例如:read(3)),就按照该指定长度(以字符为单位)从文件中读取内容,否则,就读取全文。被读出来的内容,全部塞到一个字符串里面。这样有好处,就是东西都到内存里面了,随时取用,比较快捷;“成也萧何败萧何”,也是因为这点,如果文件内容太多了,内存会吃不消的。
readline:那个可选参数size的含义同上。它则是以行为单位返回字符串,也就是每次读一行,依次循环,如果不限定size,直到最后一个返回的是空字符串,意味着到文件末尾了(EOF)。
readlines:size同上。它返回的是以行为单位的列表,即相当于先执行readline(),得到每一行,然后把这一行的字符串作为列表中的元素塞到一个列表中,最后将此列表返回。
打开文件获取句柄后就可以操作文件了。
f = open('a.txt',encode='utf-8')
a.txt内容:
尚未佩妥剑
转眼便江湖
愿历尽千帆
归来仍少年
read
#一次读取文件全部内容,读取后指针移动到文件末尾
>>> print (f.read())
尚未佩妥剑
转眼便江湖
愿历尽千帆
归来仍少年
#此时指针移动到文件末尾,再次read()将输出空内容
>>> print (f.read())
>>>
>>> f.close()
#read(size)参数显示结果,指针移动到第三个字符处
>>> print (f.read(3))
尚未佩
>>> print(f.read(2))
妥剑
>>>
readline
#一次读取文件的一行,一次指针移动到下一行
>>> print(f.readline())
尚未佩妥剑
>>> print(f.readline())
转眼便江湖
>>> print(f.readline())
愿历尽千帆
>>> print(f.readline())
归来仍少年
>>> f.close()
#readline(size)和read一样
>>> print(f.readline(2))
尚未
>>> print(f.readline(3))
佩妥剑
>>> print(f.readline(),end='')
>>> print(f.readline())
转眼便江湖
>>> print(f.readline())
愿历尽千帆
>>>
readlines
#返回一个列表,把每一行作为字符串给列表的一个元素
>>> print(f.readlines())
['尚未佩妥剑\n', '转眼便江湖\n', '愿历尽千帆\n', '归来仍少年']
#readlines(size)
>>> print(f.readlines(1))
['尚未佩妥剑\n']
>>> print(f.readlines(2))
['转眼便江湖\n']
>>> print(f.readlines(2))
['愿历尽千帆\n']
>>> print(f.readlines(1))
['归来仍少年']
>>> print(f.readlines(2))
['尚未佩妥剑\n']
>>> print(f.readlines(10))
['转眼便江湖\n', '愿历尽千帆\n']
>>> print(f.readlines(6))
['尚未佩妥剑\n', '转眼便江湖\n']
>>> print(f.readlines(5))
['愿历尽千帆\n']
>>>
提示:养成一个好习惯,只要打开文件,不用该文件了,就一定要随手关闭它。如果不关闭它,它还驻留在内存中,后面又没有对它的操作,是不是浪费内存空间了呢?同时也增加了文件安全的风险。
循环遍历文件内容
for循环遍历文件内容(一行一行地读取):
f = open('a.txt',encoding='utf-8')
for line in f:
print line
f.close()
如果文件太大,就不能用read()或者readlines()一次性将全部内容读入内存,可以使用while循环和readline()来完成这个任务
while + readline遍历文件内容:
f = open('a.txt',encoding='utf-8')
while True:
line = f.readline()
if not line: #到EOF,返回空字符串,则终止循环
break
print line , #注意后面的逗号,去掉print语句后面的'\n',保留原文件中的换行
f.close() #别忘记关闭文件
上下文管理
文件进行写入操作之后,一定要牢记一个事情:file.close(),这个操作千万不要忘记,忘记了怎么办,那就补上吧,也没有什么天塌地陷的后果。有另外一种方法,能够不用这么让人揪心,实现安全地关闭文件。
with open('a.txt','w') as f:
pass
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
data=read_f.read()
write_f.write(data)
文件的修改:
import os
with open('a.txt','r',encoding='utf-8') as read_f,\
open('.a.txt.swap','w',encoding='utf-8') as write_f:
for line in read_f:
if line.startswith('hello'):
line='哈哈哈\n'
write_f.write(line)
os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
#-----------------------------------------
import os
read_file = open('a.txt','r',encoding='utf-8')
write_file = open('.a.txt.swap','w',encoding='utf-8')
for line in read_file:
if 'alex' in line:
line = line.replace('alex','ALEXSB')
write_file.write(line)
read_file.close()
write_file.close()
os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
拷贝文件:
read_file = open('a.jpg'.'rb')
write_file = open('a.copy.jpg','wb')
write_file.write(read_file.read)
seek选项
f.seek(偏移量,选项)
seek(0,0) 默认移动到文件开头或简写成seek(0)
seek(x,1) 表示从当前指针位置向后移x(正数)个字节,如果x是负数,则是当前位置向前移动x个字节
seek(x,2) 表示从文件末尾向前后移x(正数)个字节,如果x负数,则是从末尾向前移动x个字节
# 重新设置文件读取指针到开头
f.seek(0, 0)