一 文件读取步骤
文件读取的三部曲: 打开–> 操作 -> 关闭
#打开
f=open('/tmp/file')
print(f)
#操作
f.write('hello')
#判断文件对象拥有的权限
print(f.readable()) #true or false
print(f.writable())
#关闭
f.close() #一定要关闭
注意:文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的
二 文件读取模式的选择
open(filename[,mode])
- filename代表所要读取的文件名,如不在当前目录,则需写出其绝对路径。
- mode表示对文件以什么方式打开。
三.非纯文本文档的读取
读取图片, 音乐或者视频(非文本文件), 需要通过二进制的方式进行读取与入,即模式选择加上b
读取二进制文件
rb:rb+:wb:wb+:ab:ab+:
f=open('frame1.png',mode='rb')
content=f.read()
f.close()
print(content)
四 文件的常用属性
1.buffer缓冲区对象
f=open('/mnt/passwd')
#buffer缓冲区对象
print(f.buffer)
suffer就是一个缓冲区对象
那么怎样来对缓冲区的内容进行读取呢
将缓冲区对象赋值给一个变量,通过遍历变量的内容来读取缓冲区的内容
>>> f=open('/mnt/passwd','a+')
>>> f.read()
当只是读取文件时, buffer里面没有内容
>>> f.write('123')
3
此时写入的内容在缓冲区里面,并没有真正写入磁盘文件,关闭之后写入文件
>>> f.buffer
<_io.BufferedRandom name='/mnt/passwd'>
>>> f.close()
- buffer缓冲区对象
print(f.buffer)
- 判断文件对象是否关闭, 已经关闭返回True
print(f.closed)
- 文件号
print(f.fileno())
- 文件对象
print(f.name)
- 查看文件对象的相关信息
print(f)
五 文件常用方法
1.读取文件内容
- 默认情况读取文件的所有内容, 小的文件, 直接用read读取即可,
- 如果是一个大文件时(文件大小>内存大小), 不能通过read一次性读取所有容;
f.readline() 每次读取一行内容
f.readlines() 返回包含size行的列表,size未指定则返回全部行
f.readable() 判断文件是否可读,函数的返回值为True或False
2.文件的写入操作
f.write() 从指针所在位置写入, 写入是字符串内容
f.writelines() 将列表里面的每个元素写入文件中
f.writable() 判断文件是否可写
3.指针位置的操作
f=open('/tmp/passwd','r+')
#告诉当前指针所在位置
print(f.tell())
print('1:',f.read(3)) #读取前三行
print('移动指针之前:',f.tell())
#将文件指针移动到文件最开始
#f.seek(0,0)
#将指针移动到文件最后
f.seek(0,2)
print('移动指针之后:',f.tell())
f.write('ptest')
f.close()
六 with语句
上下文管理器:打开文件, 执行完with语句内容之后, 自动关闭文件对象
with open('/tmp/lijia') as f:
print('with语句里面:',f.closed)
print(f.read())
print('after语句里面:',f.closed)
同时打开两个文件对象,(python2中不支持)
with open('/tmp/lijia') as f1,\
open('/tmp/lijj','w+') as f2:
#将第一个文件内容写入第二个文件中
f2.write(f1.read())
#移动指针到文件最开始
f2.seek(0,0)
#读取指针内容
print(f2.read())
python2 中这样实现
with open('/tmp/lijia') as f1:
content=f1.read()
with open('/tmp/lijj'.'w+') as f2:
f2.write(content)
七 读取大文件
1.通过yield,每次读取一行进行处理
def byLineReader(filename):
with open(filename) as f:
line=f.readline()
#如果可以读取到内容,则返回该行信息
while line:
yield line
line=f.readline()
#read是一个生成器
read=byLineReader('data.txt')
print(read)
2.直接for循环文件
默认遍历的内容为每一行的内容.是节省内存空间的
from collections import Iterable
f=open('data.txt')
print(isinstance(f,Iterable))
for i,item in enumerate(f):
if i==10:
break
print(i,item)