python如何断点续读文件

读取文件中的数据是python开发过程中一定会用到技能,你可以一行一行的读,也可以一次性将文件内容读进内存(不推荐这样读)。但怎么从文件的中间读,或程序断掉之后怎么从上次读到的地方接着读呢?别急,本文教你!

在介绍本文重点之前,先复习一下读文件的方法——read、readline、readlines——虽然我都不怎么用。很多读文件的代码示例中会用with关键字,我不喜欢用,也从来没用过,原因就是要写更多代码,还要两层缩进,比如这样:

read

# 一次性将文件内容读进内存中,不推荐
with open('test.txt', 'r') as f:
    lines = f.read()
    line_list = lines.split('\n')
    for line in line_list:
        print(line)

readline

with open('test.txt', 'r') as f:
    line = f.readline()
    while line:
        print(line)
        line = f.readline()

readlines

# 一次性将文件内容读进内存中,不推荐
with open('test.txt', 'r') as f:
    lines = f.readlines()
    for line in lines:
        print(line)

以上三种方法我都不推荐,我一直是这样读文件:

for line in open('test.txt'):
    print(line)

接下来,我们介绍如何实现断点续读。要实现断点续读,需要两个功能:1、记录现在读到的位置;2、直接跳到上次读的位置继续读。这个位置就是文件指针的位置。python中有两个方法可以记录文件指针和移动文件指针,分别是tell()和seek()。

tell()方法

tell方法返回文件指针当前所处的位置,用法如下:

f = open('test.txt')
print(f.tell())
f.read(6)
print(f.tell())

# 打印结果为:
0
6

seek()方法

seek方法可以将文件指针移动到指定的位置,用法如下:


f = open('test.txt')
f.seek(6)
print(f.tell())

# 打印结果为:
6

断点续读在处理大文件时非常有用,如果读取大文件时没有记录文件位置,一旦程序因某种原因中途退出,那么再启动时就要再从头处理,当然,你也可以选择记录行数的方法记录上次读到了第几行,下次再执行时跳过已经处理过的行数,但这还是要从头逐行过滤。

在实时读取正在写的文件时,断点续读也会有大用处。比如一个进程正在写一个json文件,另一个进程要实时将文件中的数据同步处理到其他地方,那么在读文件的最后一行时可能内容还没写完,这个时候json.loads()会报错,这个时候可以记录倒数第二行的文件指针,然后关闭文件,等到一段时间后再读文件,且从上次记录的指针位置开始读。实例代码如下:

import json

last_site = open('site.txt').read().strip()
f = open('test.txt')
f.seek(last_site)
while True:
    line = f.readline()
    try:
        data = json.loads(line)
        last_site = f.tell()
    except:
        site_f = open('site.txt', 'w')
        site_f.write(str(last_site))
        site_f.close()
        break
    print(data)

在实际生产中,一般要处理一系列文件,这个时候要记录的文件指针位置还要与文件名相对应,文件指针位置也可以保存在mysql、redis中等。

你可能感兴趣的:(Python,python,etl)