gpt4 book ai didi

Python - 如何在大文件中搜索字符串

转载 作者:太空宇宙 更新时间:2023-11-04 09:54:20 24 4
gpt4 key购买 nike

我有一个大文件,其中可以包含 file_+0.txt、file_[]1.txt、file_~8.txt 等字符串

我想找到丢失的 files_*.txt 直到某个数字。

例如,如果我给下面的文件和一个数字 5,它应该告诉我缺少的是 1 和 4

asdffile_[0.txtsadfe
asqwffile_~2.txtsafwe
awedffile_[]2.txtsdfwe
qwefile_*0.txtsade
zsffile_+3.txtsadwe

我写了一个 Python 脚本,我可以给它提供文件路径和一个数字,它会给我所有在该数字之前丢失的文件名。

我的程序适用于小文件。但是当我给出一个文件编号可以达到 10000 的大文件 (12MB) 时,它就会挂起。

这是我当前的 Python 代码

#! /usr/bin/env/python
import mmap
import re

def main():
filePath = input("Enter file path: ")
endFileNum = input("Enter end file number: ")
print(filePath)
print(endFileNum)
filesMissing = []
filesPresent = []
f = open(filePath, 'rb', 0)
s = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
for x in range(int(endFileNum)):
myRegex = r'(.*)file(.*)' + re.escape(str(x)) + r'\.txt'
myRegex = bytes(myRegex, 'utf-8')
if re.search(myRegex, s):
filesPresent.append(x)
else:
filesMissing.append(x)
#print(filesPresent)
print(filesMissing)

if __name__ == "__main__":
main()

当我给出一个 12MB 的文件时,输出挂起,该文件可以包含从 0 到 9999 的文件

$python findFileNumbers.py
Enter file path: abc.log
Enter end file number: 10000

小文件的输出(同上例)

$python findFileNumbers.py
Enter file path: sample.log
Enter end file number: 5
[0, 2, 3]
[1, 4]
  1. 我怎样才能让它适用于大文件?
  2. 有没有比 Python 脚本更好的方法来获得这些结果?

提前致谢!

最佳答案

首先将现有的集合收集起来,然后寻找缺失的集合。

my_regex = re.compile('.*file.*(\d+)\.txt.*')
present_ones = set()
for line in open(filepath):
match = my_regex.match(line)
if match:
present_ones.add(int(match.group(1)))
for num in range(...):
if num not in present_ones:
print("Missing" + num)

你的挂起的原因是你正在为每个数字检查整个文件。即 12MB * 10000 = 120GB 该脚本将通过 120GB,因此即使您将它放在 mmap 中它也会挂起。

关于Python - 如何在大文件中搜索字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46476537/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com