我希望使用re实现几行python,首先操作一个字符串,然后将该字符串用作正则表达式搜索。我有字符串{^
我提出了[\s\S]*?
的正则表达式来输入,而不是*
的正则表达式。因此,我想从一个示例字符串ab***cd
到^ab[\s\S]*?cd
,然后将其用于文档的正则表达式搜索
然后我想在mmap中打开文件,使用正则表达式搜索它,然后将匹配项保存到文件中
import re
import mmap
def file_len(fname):
with open(fname) as f:
for i, l in enumerate(f):
pass
return i + 1
def searchFile(list_txt, raw_str):
search="^"+raw_str #add regex ^ newline operator
search_rgx=re.sub(r'\*+',r'[\\s\\S]*?',search) #replace * with regex function
#search file
with open(list_txt, 'r+') as f:
data = mmap.mmap(f.fileno(), 0)
results = re.findall(bytes(search_rgx,encoding="utf-8"),data, re.MULTILINE)
#save results
f1 = open('results.txt', 'w+b')
results_bin = b'\n'.join(results)
f1.write(results_bin)
f1.close()
print("Found "+str(file_len("results.txt"))+" results")
searchFile("largelist.txt","ab**cd")
现在,使用一个小文件就可以了。但是,当文件变大(1gb的文本)时,我会出现以下错误:
Traceback (most recent call last):
File "c:\Programming\test.py", line 27, in <module>
searchFile("largelist.txt","ab**cd")
File "c:\Programming\test.py", line 21, in searchFile
results_bin = b'\n'.join(results)
MemoryError
首先,有人能稍微优化一下代码吗?我做错什么了吗?我使用mmap是因为我知道我想查看大文件,我想逐行读取文件,而不是一次全部读取(因此有人建议使用mmap)
我还被告知要去熊猫图书馆查看更多的数据操作。熊猫会取代mmap吗
谢谢你的帮助。正如您所说,我对python还很陌生,所以非常感谢您的帮助
我不确定您认为使用
mmap
打开输入文件会有什么好处,但由于必须匹配的每个字符串都由新行分隔(根据您的注释),因此我将使用以下方法(注意,它是Python,但故意保留为伪代码):可能会根据需要调整
print
函数的endline
参数这样,结果在生成时被写入,并且在写入之前避免在内存中有一个大的
results
。 此外,您不需要专注于换行。只有每一行是否匹配这个怎么样?在这种情况下,您需要的是以字符串表示的所有行的列表。以下内容模拟了该操作,生成了字符串列表:
输出
这是最重要的部分
输出
Edit2:试试这个:(我看不出你有什么理由想把它作为一个函数,但我已经这样做了,因为你在评论中就是这么做的。)
基于块的方法
dask方法
您正在逐行处理,因此希望避免在内存中积累数据。在这里,常规的文件读写应该可以很好地工作
mmap
由虚拟内存支持,但在读取时必须转换为真实内存。在findall
中累积结果也是一种内存占用。请尝试以下替代方法:相关问题 更多 >
编程相关推荐