python之文件操作

这篇博客详细介绍了Python中文件操作的各个方面,包括文件读取的三部曲:打开、操作和关闭,文件读取模式的选择(如'r', 'w', 'a'等),非纯文本文件的读取,文件的常用属性和方法,如read(), readline(), readlines(), write()等,还讨论了使用with语句确保文件安全读取,以及通过yield处理大文件的方法,最后对比了不同文件读取速率。" 103525948,8529784,Yii2框架下使用OSS PHP SDK对象存储,"['前端开发', 'PHP', 'Yii框架', '云存储', '阿里云']

1.文件读取三部曲

打开—>操作—>关闭

1.打开

open(‘要打开的文件名’)
f=open('/tmp/passwd')
print(f)
![这里写图片描述](https://img-blog.youkuaiyun.com/20180823215014489?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZvcmV2ZXJfd2Vu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 可以看到生成了一个文件对象 注意:若文件不存在会报错,并且给出错误码和详细的信息告诉你文件不存在 ![这里写图片描述](https://img-blog.youkuaiyun.com/20180823215254128?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZvcmV2ZXJfd2Vu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

2.操作

content = f.read()   ####读取文件
print(content)
![这里写图片描述](https://img-blog.youkuaiyun.com/20180823215505244?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZvcmV2ZXJfd2Vu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
content = f.write()   ###写入操作
print(content)
![这里写图片描述](https://img-blog.youkuaiyun.com/20180823215642143?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZvcmV2ZXJfd2Vu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 我们发现这里无法写入,因为对文件读取模式没有选择,下面会进行详解
f=open('/tmp/passwd')
print(f.readable())   ##判度是否可读,返回bool值
print(f.writable())   ###判度是否可写
###返回True即可进行操作
![这里写图片描述](https://img-blog.youkuaiyun.com/20180823215933247?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZvcmV2ZXJfd2Vu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

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)
![这里写图片描述](https://img-blog.youkuaiyun.com/2018082407040565?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZvcmV2ZXJfd2Vu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) ![这里写图片描述](https://img-blog.youkuaiyun.com/20180824070412461?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZvcmV2ZXJfd2Vu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 同时**打开两个文件对象**(这种写法,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)
![这里写图片描述](https://img-blog.youkuaiyun.com/20180824070916419?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZvcmV2ZXJfd2Vu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) ![这里写图片描述](https://img-blog.youkuaiyun.com/20180824070924954?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZvcmV2ZXJfd2Vu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

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')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值