python文件操作

python文件操作

在计算机中,硬盘借助文件系统才能存取数据。在python里,文件是一种类型对象,类似于数据类型,包括文本的、图片的、音频的、视频的等等。python提供了方法来操作文件。

文件处理流程

  1. 打开文件,指定打开文件的模式,获取文件的句柄

  2. 之后通过句柄对文件进行操作

  3. 关闭文件

打开文件

文件句柄 = 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)
posted @ 2017-06-12 23:55  村口王铁匠  阅读(316)  评论(0编辑  收藏  举报