Python中的文件操作
文件操作基本流程:
文件操作基本流程:
1.打开文件
2.文件操作
3.关闭文件
在进行文件操作前,先准备要操作的文件/tmp/paswd:
cp /etc/passwd /tmp/
#1.打开文件
f = open('/tmp/passwd')
#2.文件操作
print(f)
#3.关闭文件
f.close()
可以看到,打开的文件所引用的内存空间f是一个保存了/tmp/passwd文件信息的数据结构
要查看具体的文件内容,要调用相应的文件操作函数,操作如下:
content = f.read()
print(content)
打开文件的参数选择:
上面打开文件的语句中,只有操作的目标文件这一参数
而对文件的操作权限这一参数,使用的是默认参数'r'
r
(readonly)默认参数
只能读,不能写
读取文件不存在 会报错
f = open('/tmp/passwd','w')
content = f.read()
print(content)
w
写文件(write only)
只能写,不能读
文件存在的时候,会清空文件的内容并写入新的文件内容(实际上,准确地说是将从文件指针开始后的内容都删除了)
文件不存在的时候,会创建新的文件并写入内容
f = open('/tmp/passwd/','w')
f.write('westos')
需要注意的是,不仅要在打开文件的时候在函数参数中赋予写权限。
同时也要注意,在真实的操作系统中,执行该程序的进程的用户是否有权限对于文件进行操作
因此,在使用该参数之前,要对文件权限进行更改:chmod 777 /tmp/passwd
(这一点,应该是只需要在linux这种多用户的操作系统中注意;在windows等单用户的操作系统中应该是不需要注意的)
a
追加,也不能进行读操作
写:不会清空文件内容,会在文件末尾追加
写:文件不存在的时候,不会报错,会创建新文件并写入内容
w+
可以读,也可以写
写:文件不存在 不报错 会创建新文件并写入
读不存在的文件时,也会将其创建出来
若文件已经存在,会清空原文件(无论读,写操作)
r+
r/w
写操作:不会清空文件
文件不存在 报错(无论读写操作)
a+
r/w
对于不存在的文件会创建出来(无论读写操作)
写操作不会清空文件
以上有+号的参数,均表示即可以读,也可以写
r,w,a三个参数除了在具体的操作上有所不同以外,初始的文件指针指向位置也有不同
r 文件初始位置
w 文件初始位置
a 文件末尾位置
对于一个文件同时进行两次读操作,第二次将无法读取到文件内容,因为文件指针位置改变了(文件指针已经移动到了文件末尾了)
# 判断文件对象拥有的权限
print(f.readable()) # 判断对文件是否有写权限
print(f.writable()) # 判断对文件是否有读权限
# 判断文件指针的位置
print(f.tell())
处理二进制文件:
上面的参数均是处理文本文件的
应该说,'r'等参数都是默认为'rt'(read txt)参数
即, r r+ w w+ a a+ == rt rt+ wt wt+ at at+ 左右各个参数是等价的
而如果读取的是 图片 音频 视频(非纯文本文件)
就需要通过二进制的方式读取和写入
二进制文件操作参数: rb rb+ wb wb+ ab ab+
基本应用示例:
将图片hello.jpg文件复制一份到当前目录下
# 读取二进制文件内容
f1 = open('hello.jpg',mode='rb')
content = f1.read()
f1.close()
f2 = open('lucky.jpg',mode='wb')
# 写入要复制的文件的内容
f2.write(content)
f2.close()
改变文件指针位置:
f = open('/tmp/passwd','rb+')
"""
默认情况下读取文件的内容
对于小的文件:直接用read读取即可
如果是一个大文件(文件大小>=内存) readline()
"""
# 按行读取
print(f.readline()) #会将每一行末尾的\n也读取
# f.read() 按字节读取,若不传入参数,默认从文件指针位置读取到文件末尾
content=f.read(4)
print(content)
# 读取文件的全部内容,返回一个列表,文件内容的每行是其列表元素
print(f.readlines())
print(f.tell())
# seek():指针的移动
# 第一个参数:偏移量 >0:向后移动 <0:向前移动
# 第二个参数:
# 0:移动到文件开头
# 1:当前位置
# 2:移动到文件的末尾
f.seek(2,0)
print(f.tell())
f.close()
seek移动指针的时候,一定是要用二进制方式打开文件。否则会报错
seek两个参数,先看第二个参数
从第二个参数位置处,根据第一个参数决定从第二个参数位置处的移动量到的最终位置
上下文管理器:
上下文管理器:打开文件 执行完with语句后 自动关闭文件
写法:
with open('filename') as f: # with关键字 open函数打开目标文件 as 引用文件的变量:
文件操作语句
f = open('/tmp/passwd')
with open('/tmp/passwd') as f:
print(f.read())
print(f.closed)
使用该语句,结束语句内容后,自动关闭文件
python3中支持一条语句,一行,打开两个文件
而python2则不行
# python3.x
# 将第一个文件的内容写入第二个文件中
with open('data.txt') as f,open('data2.txt','w+') as f2:
f2.write(f.read())
f2.seek(0,0)
print(f2.read())
# python2.x
with open('data.txt') as f:
content = f.read()
with open('data2.txt') as f2:
f2.write(content)