正则匹配URL无法存入字典?大文件分块读取异常排查
分块读取大文件提取URL的错误修复
问题说明
作业要求用正则表达式分块读取原始数据文件,提取所有URL并统计出现次数,但目前代码存在两个核心问题:
- 匹配结果异常:字典中存储的是数字而非真实URL
- 文件读取不完整:设置chunkSize为50时,仅检查前50字节,无法遍历整个文件
错误原因
- 循环遍历逻辑错误:
fileContents是字节串,直接for URL in fileContents会逐个取出每个字节的十进制数值,你看到的"URL"其实是单个字节的数字,和匹配到的真实URL完全无关 - 文件读取仅执行一次:
fileContents = targetFile.read(chunkSize)只读取了第一块数据,没有循环读取后续内容,自然无法遍历整个文件 - 统计逻辑混乱:每次循环都重复调用
findall,还把字节数值作为键存入字典,完全没用到匹配到的URL结果 - 表格生成逻辑错误:嵌套循环重复添加行,且
break导致表格只生成一次就终止
修复后的代码
import re import os import sys from prettytable import PrettyTable largeFile = input("输入大文件名: ") chunkSize = int(input("设置分块大小: ")) # 保留你验证过的正则表达式 urlPattern = re.compile(b'\\w+:\/\/[\\w@][\\w.:@]+\/?[\\w\.?=%&=\-@/$,]*') matches = {} try: if os.path.isfile(largeFile): with open(largeFile, 'rb') as targetFile: print("\n提取到的URL:") # 循环读取文件分块,直到读取完毕 while True: fileChunk = targetFile.read(chunkSize) if not fileChunk: break # 读到文件末尾,终止循环 # 从当前分块中匹配所有URL urlMatches = urlPattern.findall(fileChunk) # 遍历匹配结果,统计出现次数 for url in urlMatches: # 将字节格式的URL转为字符串,方便显示和存储 url_str = url.decode('utf-8') if url_str in matches: matches[url_str] += 1 else: matches[url_str] = 1 print(url_str) # 生成统计表格 tbl = PrettyTable(["URL", "出现次数"]) tbl.align = 'l' for url, cnt in matches.items(): tbl.add_row([url, cnt]) # 按出现次数倒序输出表格 print("\nURL统计结果:") print(tbl.get_string(sortby="出现次数", reversesort=True)) else: print(f"{largeFile} 不是有效的文件") sys.exit("脚本终止") except Exception as err: print(f"错误信息: {err}")
关键修改点
- 循环读取文件:用
while True循环持续读取文件分块,直到read()返回空字节串(文件读取完毕) - 正确遍历匹配结果:先从当前分块中匹配所有URL,再遍历这些匹配结果进行统计,不再直接遍历字节串
- 字节串转字符串:将匹配到的字节格式URL转为UTF-8字符串,方便后续存储和显示
- 修复表格生成逻辑:移除嵌套循环和多余的
break,确保所有统计结果都能正确添加到表格中
内容的提问来源于stack exchange,提问作者Java_Assembly55
相关产品推荐
相关产品推荐

