Python读写大文件

427 阅读1分钟

对于特大的(4GB以上)json文件,或者txt文件,Python往往不太好直接处理,如果整个文件读取很可能会导致服务器内存爆满,本地主机也会导致memory错误,因为采用分块的方式读写文件,会更加灵活,并且也可以一边读一边使用,节约时间。下面提供两种方案对大的json文件进行读写。

# !/usr/bin/env Python
import config
import redis
import base64
import re

# 读写json文件
try:
    redis_pool = redis.Redis(host=config.redis_host, port=config.redis_port, password=config.redis_password)
except Exception as e:
    print('链接redis出错:{}'.format(e))

f = open("../result3.json", 'r', encoding='utf-8')

#result2.json里面存储的都是种子url,读取以后文件通过base64编码以列表的格式lpush写入redis

# 按块读取
while True:
    try:
        #按快读取每次1024b个字节
        block = f.read(1024)
        result = re.findall('({.*})', block)
        for i in result:
            print('写入redis成功:{}'.format(i))
            bs64_result = base64.b64encode(i.encode('utf-8'))
            redis_pool.lpush(config.indexdata, bs64_result)
    except StopIteration:
        False
        print('文件读写结束')


# 按行读取
f = open("../result3.json", 'r', encoding='utf-8')
while True:
    try:
        block = f.readline()
        result = re.search('({.*})',block).group(0)
        print('写入redis成功:{}'.format(result))
        bs64_result = base64.b64encode(result.encode('utf-8'))
        redis_pool.lpush(config.indexdata, bs64_result)
    except StopIteration:
        False
        print('文件读写结束')