You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则匹配URL无法存入字典?大文件分块读取异常排查

分块读取大文件提取URL的错误修复

问题说明

作业要求用正则表达式分块读取原始数据文件,提取所有URL并统计出现次数,但目前代码存在两个核心问题:

  • 匹配结果异常:字典中存储的是数字而非真实URL
  • 文件读取不完整:设置chunkSize为50时,仅检查前50字节,无法遍历整个文件

错误原因

  1. 循环遍历逻辑错误:fileContents是字节串,直接for URL in fileContents会逐个取出每个字节的十进制数值,你看到的"URL"其实是单个字节的数字,和匹配到的真实URL完全无关
  2. 文件读取仅执行一次:fileContents = targetFile.read(chunkSize)只读取了第一块数据,没有循环读取后续内容,自然无法遍历整个文件
  3. 统计逻辑混乱:每次循环都重复调用findall,还把字节数值作为键存入字典,完全没用到匹配到的URL结果
  4. 表格生成逻辑错误:嵌套循环重复添加行,且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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:55:30