python 自动化运维之大文件读取

一、 文件操作简介

文件操作的基本流程:

获取文件句柄
打开文件
通过句柄对文件操作
关闭文件
file=open("a.txt")  # 打开文件,得到一个文件句柄,并赋值给一个变量
print(f.read())     # 输出文件的内容
f.close()           # 关闭文件 

mode 常用参数:
mode参数
注意

  1. 默认的打开方式是’rt’(mode=‘rt’);Python是区分二进制方式和文本方式的,当以二进制方式打开一个文件时(mode参数后面跟’b’),返回一个未经解码的字节对象;当以文本方式打开文件时(默认是以文本方式打开,也可以mode参数后面跟’t’),返回一个按系统默认编码或参数encoding传入的编码来解码的字符串对象;
  2. buffering是一个可选的参数,buffering=0表示关闭缓冲区(仅在二进制方式打开时可用);buffering=1表示选择行缓冲区(仅在文本方式打开时可用);buffering大于1时,其值代表固定大小的块缓冲区的大小。当不指定该参数时,默认的缓冲策略是这样的:二进制文件使用固定大小的块缓冲区,文本文件使用行缓冲区.

二、大文件读取

当文件较小时,我们可以一次性全部读取到内存中,对文件操作后,再保存至磁盘(持久化),这样速度很快;

1. 读取小文件并操作

with open('a.txt') as read_f, open('.a.txt.swap','w') as  write_f:
        data=read_f.read()   # 读取所有数据到内存
        data=data.replace('str1','str2')   # 对字符串进行替换操作

        write_f.write(data)  # 一次性写入文件
 
os.remove('a.txt')  #删除源文件
os.rename('.a.txt.swap','a.txt')  # 重命名修改后的文件

2. 大文件读取

当文件很大时,如GB级的文本文件,一次性读取全部数据到内存中将会导致运行非常缓慢,此时我们可以通过可迭代方式(部分读取)将文件的内容逐行(指定大小)读入内存,在逐行写入新文件,然后用新文件覆盖源文件;

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
        for line in read_f:  # 逐行读取操作,防止文件过大内存溢出
            line=line.replace('str2','str1') # 在内存中修改数据
            write_f.write(line)  # 将所有数据写入文件

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')

3. 其他处理大数据的方法

1. 通过read(size),指定读取的字节数。
while True:
	block=f.read(1024)
	if not block:
		break
2. 通过readline(),每次读取一行。
while True:
	line=f.readline()
	if not line:
		break
3. 更多file 对象操作函数。

在这里插入图片描述
完整大文件处理代码:

# encoding= utf-8

import os
import time

# 适合GB级别的文件读取
def readLine():
    with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
        for line in read_f:  
            # line=line.replace('str2','str1') # 在内存中修改数据
            line=line.replace('str2','str1') # 在内存中修改数据
            write_f.write(line)  # 将所有数据写入文件
    os.remove('a.txt')
    os.rename('.a.txt.swap','a.txt')

# 适合小文件读取
def readAll():
    with open('a.txt') as read_f, open('.a.txt.swap','w') as  write_f:
        start=time.time()
        data=read_f.read()   # 读取所有数据到内存
        data=data.replace('str1','str2')   # 对字符串进行替换操作

        write_f.write(data)  # 一次性写入文件
    
    print(time.time()-start)
    os.remove('a.txt')
    os.rename('.a.txt.swap','a.txt')

if __name__ == "__main__":
   readAll()
   readLine()

可以根据自己需求进行二次开发;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值