首页 > 解决方案 > 如何使用带有缓冲区/大小提示 Python 的文件 I/O 防止数据丢失/错误计数

问题描述

我是 Python 新手,正在编写几种方法来处理大型日志文件(大于 5GB)。通过我所做的研究,我看到很多人使用“with open”并指定一个大小提示/缓冲区,如下所示:

with open(filename, 'rb', buffering=102400) as f:
    time_data_count = 0
    logbinset = set()
    #def f(n):print('{:0b}'.format(n))  #check what non iteratable function means
    search_pattern = regex.compile(b'\d+\((.)+\)\s+\d+\((.)+\)')
    for line in f:
        if search_pattern.search(line):
            x = search_pattern.search(line)
            #print(x.group(1)+" "+ x.group(2))
            print((x.group(1)).decode())
            print((x.group(2)).decode())

另一种方法(由于某种原因,这个方法总是不返回。可以使用一些帮助找出原因:

with open(filename, 'rb') as f:
    #text = []
    while True:
        memcap = f.read(102400)
        if not memcap:
            break
        text = re.search(b'\d+\(.+\)\s+\d+\(.+\)',memcap) 
        if text is None:
            print("none")
        print(text.group())

在这些方法中,我试图从 6GB 的日志文件中提取正则表达式模式。我的问题是,我担心使用缓冲区将文件切成块可能会导致包含模式的行被切成两半的情况,这会导致一些数据丢失。

如何确保保持线路完整性?我如何确保它只在行尾分解我的文件?如何确保不会丢失块之间的数据?或者“with open”和 read(102400) 方法是否确保在将文件分成块时不会将行分成两半。

标签: pythonpython-3.xregex

解决方案


首先不要使用'rb',只使用'r',它用于文本。'rb' 用于二进制数据。read 方法可以读取您指定的任意数量的字符,因此您最终会得到截断的行。使用阅读线。


推荐阅读