1、文件的读写
打开文件的三步:打开 --> 操作 --> 关闭
权限:
-
r:(默认)
- 只能读,不能写
- 读取的文件不存在,会报错
-
r+:
- 可以执行读写操作
- 文件不存在,报错
- 默认情况下,从文件指针所在位置开始写入
-
w:
- 只有写权限
- 文件存在时,会清空文件之前的内容
- 文件不存在,不会报错,会创建新的文件并写入
-
w+:
- 可读可写
- 文件存在时,会清空文件内容
- 文件不存在,不报错,会创建新的文件
-
a:
- 只有写权限
- 文件存在时,不会清空文件内容,会添加到文件的最后一行
- 文件不存在时,会报错
-
a+:
- 可读可写
- 文件存在时,不清空文件内容,在末尾追加
- 文件不存在,不报错,直接创建文件并写入
f = open('/tmp/passwd','w+') ##打开文件
con = f.read() ##读操作
print(con)
print(f.writable()) ##查看写权限
print(f.readable()) ##查看读权限
print(f.tell()) #查看当前指针所在的位置
f.write('hello') #写操作
print(f.tell())
f.close() #关闭
运行结果:
True
True
0
5
2、文件的读取操作
默认情况下读取文件的所有内容,小文件可以直接用read读取,如果
是大文件(文件大小>内存大小),不能通过read一次性读取所有内容。
- read():读取所有
f = open('/tmp/passwd','r+')
print(f.read())
运行结果:
hello
nihao
hello linux
- readline():只读取一行,默认读取第一行
f = open('/tmp/passwd','r+')
print(f.readline())
运行结果:
hello
- readlines():读取文件内容,返回一个列表,列表的元素分别为文件
行内容
f = open('/tmp/passwd','r+')
print(f.readlines())
f.close()
运行结果:
['hello\n', 'nihao\n', 'hello linux\n']
f = open('/tmp/passwd','r+')
print(f.read(4)) #类似于head -c 4 /tmp/passwd
print(f.readline(),end='') ##从当前指针继续读取
print(f.readlines(),end='')
f.close()
运行结果:
hell
o
['nihao\n', 'hello linux\n']
f = open('/tmp/passwd','r+')
print(f.read(4))
print([line.strip() for line in f.readlines()])# 将字符串遍历分开,另一种方法:print(list(map(lambda x:x.strip(),f.readlines())))
f.close()
运行结果:
hell
['o', 'nihao', 'hello linux']
- write():文件的写操作
- writelines([‘a’,‘b’]) :将列表里的每个元素写入文件
3、文件的指针seek
- seek方法,移动指针
- seek的第一个参数是偏移量:>0,表示向右移动,<0表示向左移动
- seek的第二个参数是:
0:移动指针到文件开头
1:不移动指针
2:移动指针到末尾
f = open('/tmp/passwd','rb+') ##b代表二进制文件
print(f.tell()) ##显示当前指针所在位置
print(f.read(3))
print(f.tell())
f.seek(-1,2) ##将文件指针向左移到末尾
print(f.read())
print(f.tell())
f.close()
运行结果:
0
b'roo'
3
b'\n'
2243
4、非纯文本文件的读取
- 读取文本文件:r r+ w w+ a a+
- 读取二进制文件:rb rb+ wb wb+ ab ab+
f1 = open('hello.png',mode='rb')
content = f1.read()
f1.close()
f2 = open('111.jpg',mode='wb')
f2.write(content)
f2.close()
5、上下文管理器
上下文管理器:打开文件,执行完with语句内容之后,自动关闭文件对象。
with open('/tmp/passwd') as f:
print(f.read())
运行结果:(为/tmp/passwd的文件内容)
setroubleshoot:x:992:989::/var/lib/setroubleshoot:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
- 同时打开两个文件:
with open('/tmp/passwd') as f1,open('/tmp/passwd1','w+') as f2:
f2.write(f1.read()) ##将第一个文件的内容写入第二个文件中
f2.seek(0) ##移动指针到文件最开始
print(f2.read()) ##读取第二个文件内容
运行结果:(为/tmp/passwd的文件内容)
setroubleshoot:x:992:989::/var/lib/setroubleshoot:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
6、文件的实例练习
- 例
"""
# _*_coding:utf-8 _*_
Name:文件_03.py
Date:4/9/19
Author:LiMin
Connect:314690259@qq.com
Desc:
"""
"""
创建文件data.txt,文件共100000行,每行存放一个1~100之间的整数,写完后读取文件内容
"""
import random
f = open('date.txt','w+')
for i in range(100000):
f.write(str(random.randint(1,100)) + '\n')
f.seek(0)
print(f.read())
f.close()
运行结果:
...
25
3
53
37
43
26
...