python - 如何使用带有缓冲区/大小提示 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) 方法是否确保在将文件分成块时不会将行分成两半。
解决方案
首先不要使用'rb',只使用'r',它用于文本。'rb' 用于二进制数据。read 方法可以读取您指定的任意数量的字符,因此您最终会得到截断的行。使用阅读线。
推荐阅读
- ios - AVAudioSession setCategory Swift 4.2 iOS 12 - 静音播放声音
- python - 使用命令行参数通过 Ansible playbook 多次运行 python 脚本
- google-sheets - Google 电子表格 - 查找列中的前五个值
- python - 如何使用一个函数或 for 循环导入大量 csv 数据文件?
- html - HTML/CSS Plotly 绘图大小
- javascript - 循环javascript内的SetInverval
- batch-file - 在批处理文件中循环到目录以查找子目录和文件,当目标中存在时重命名为 _OLD 并将新文件复制到目标
- c# - Autofac 程序集扫描仪模式 - 自定义属性
- javascript - 无法在 java webservice 中发送 html 表单 ajax 数据
- powershell - 具有变量文件夹名称的测试路径