1.文件读取三部曲
打开—>操作—>关闭1.打开
open(‘要打开的文件名’)f=open('/tmp/passwd')
print(f)

可以看到生成了一个文件对象
注意:若文件不存在会报错,并且给出错误码和详细的信息告诉你文件不存在

2.操作
content = f.read() ####读取文件
print(content)

content = f.write() ###写入操作
print(content)

我们发现这里无法写入,因为对文件读取模式没有选择,下面会进行详解
f=open('/tmp/passwd')
print(f.readable()) ##判度是否可读,返回bool值
print(f.writable()) ###判度是否可写
###返回True即可进行操作

3..关闭
文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源。f.close()
2.文件读取模式的选择
文件读取模式也就是再打开文件时,所进行的参数选择,默认 mode=‘r’
下面就各参数分析
1) r:
- 只能读,不能写
- 读取的文件不存在,报错
- 默认情况下,从文件指针所在位置开始写入
2) r+
-可以读,可写
- 文件不存在,报错
- 默认情况下,从文件指针所在位置开始写入
f=open('/tmp/passwd',mode='r+')
# print(f.read()) ##如果先执行读取操作,指针会留在文件的最后,再进行写的话,会在文件最后写入
print(f.write('hello 15'))###直接写入的话会从文件开始写入
print(f.read()) ###写入时,返回的是写入的字符个数
f.close()
3)w
-只能写入,不能读取文件内容
-如果文件存在,先清空文件内容,再操作
-如果文件不存在,先创建,再操作
f=open('/tmp/passwd',mode='w')
print(f.write('hello 15'))
f.close()
4)w+
-可读可写
-如果文件不存在,先创建,再操作
-如果文件存在,先清空文件内容,再操作
5)a
a:
-不可读,可写
-文件不存在,不报错
-不清空文件内容,定位到文件的末尾,是一个追加的操作
f=open('/tmp/passwd',mode='a')
print(f.write('hello 15'))
f.close()
6)a+ a+:
-可读,可写
-文件不存在,不报错
-不清空文件内容,定位到文件的末尾,是一个追加的操作
3.非纯文本文件的读取
如果读取图片,音乐或者视频(非文本文件),需要通过二进制的方式进行读取和写入
这里其实也就是在读取文本文件的读取模式后边加b
rb:rb+:wb:wb+:ab:ab+:
例:我这里有一个hello.png文件
#先读取二进制文件内容,保存在变量content中
f1=open('hello.png',mode='rb')
content=f1.read()
print(content)
f1.close()
我们会发现生成了一个二进制文件
#把生成的二进制文件用另一个文件打开,并写入
f2=open('hello1.png',mode='wb')
f2.write(content)
f2.close()
print(f2)
就会发现生成了一个图片文件
4.文件的常用属性
##判断文件是否已经关闭,已经关闭返回True
f=open('/tmp/passwd')
print(f.closed)
##文件号
print(f.fileno())
###文件对象
print(f.name)
###查看文件对象的相关信息
print(f)
5.文件常用方法
1.读取文件内容
1).f.read()
默认情况读取文件的所有内容,小的文件,直接用read读取即可
如果是一个大文件时,(文件大小>内存大小,),此方法不可取
f=open('/tmp/passwd',mode='r')
print(f.read()) ###读取文件的所有内容
print(f.read(3)) ##读取文件的前三个字符 ###类似于:head -c 3 /tmp/passwd
2)
f.readline(),end=” 每次只读取文件的一行
f.readline()
f=open('/tmp/passwd',mode='r')
print(f.readline(),end='')
print(f.readline())
3)
f.readlines() 读取文件的所有内容,返回一个列表,列表元素分别为文件行内容
对于每一行,去掉后面的\n
f=open('/tmp/passwd',mode='r')
###列表生成式
print([line.strip() for line in f.readlines()])
###map函数
print(list(map(lambda x:x.strip(),f.readlines())))
2.文件的写入操作
1)f.write()从指针所在位置写入,写入的是字符串
2)f.writelines() 将列表中的每个元素写入文件中
f=open('/tmp/passwd',mode='a+')
print(f.writable())
li = ['user'+str(i)+'\n' for i in range(10)]
f.writelines(li)
3.指针位置的操作
f=open(‘/tmp/passwd’,mode=’r’)
print(f.tell()) 告诉当前指针所在位置
f.seek(2,0) 第二个参数0,表示将文件指针移动到文件最开始
第一个参数表示指针的偏移量,
f.seek(0,1) 第二个参数1,表示将文件指针移动到当前位置
f.seek(0,2) 第二个参数2,表示将文件指针移动到文件最末尾
**注意:当第二个参数为0时,才可以给第一个参数传非0值
当第二个参数不为0时,若给第一个参数传非0值会报错**
f=open('/tmp/passwd',mode='r')
print(f.tell())
f.seek(2,0)
print(f.tell())
f.seek(0,1)
print(f.tell())
f.seek(0,2)
print(f.tell())
6.文件安全读取之with语句
一般情况打开一个文件,经过操作之后,都要显式的执行xx.close() 将文件关
闭 .with 用于需要打开、关闭成对的操作,可以自动关闭打开对象 .
f = open('/tmp/passwd')
with open('/tmp/passwd') as f:
print("with语句里面:", f.closed)
print(f.read())
print("after with语句:", f.closed)


同时**打开两个文件对象**(这种写法,python2中不支持)
若要想在python2中打开两个,需要with嵌套with语句
with open('/tmp/passwd') as f1,open('/tmp/passwdBack','w+') as f2:
print(f1.closed)
###将第一个文件的内容写入第二个文件中
f2.write(f1.read())
###移动指针到文件最开始
f2.seek(0,0)
# 读取文件内容
print(f2.read())
print(f1.closed)
print(f2.closed)


7.yield实现大文件的读取
1.文件操作
1)创建文件data.txt,文件共100000行,每行存放一个1~100之间的数
2)找出文件中数字出现次数最多的10个数字,写入文件mostNum.txt;
import random
with open('data.txt',mode='a+') as f:
for i in range(100000):
f.write(str(random.randint(1,100))+'\n')
通过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)
# 1)next读取生成器的内容
print(next(read))
print(next(read))
print(next(read))
# 2)通过for 循环
# for item in read:
# print(item)
###面向对象
def sort_by_count(filname='data1.txt',count=10):
with open(filname) as f:
numcount=Counter(f)
return numcount.most_common(10)
print(sort_by_count('data.txt',10))
文件对象是可以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,end='')
8.读取文件的速率比较
for line in f.readlines()
for line in f
from Pack01.myTimeit import timeit ####这里的 Pack01.myTimeit是我之前写好的包里面的装饰器函数,进行时间的计算。之前的文章中有,可以进行参考
@timeit
def read1(filename):
with open(filename) as f:
for line in f.readlines():
#对文件的处理操作
line=int(line.strip())
line=line+1
read1('data.txt')
@timeit
def read2(filename):
with open(filename) as f :
for line in f:
line = int(line.strip())
line = line + 1
read2('data.txt')