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

如何使用concurrent futures统计每个URL的行数?

统计多个URL文件的行数(基于concurrent.futures)

需求说明

我有多个文本文件的URL:

  • https://website.com/files/123.txt
  • https://website.com/files/456.txt
  • https://website.com/files/789.txt

每个文件内容示例:

line1
line2
line3
line4
line5

需要用concurrent.futures并发统计每个文件的行数,现有代码目前仅统计字节数,需调整实现。

修改后的代码

import concurrent.futures
import urllib.request

URLS = ['https://website.com/files/123.txt',
        'https://website.com/files/456.txt',
        'https://website.com/files/789.txt']

def count_lines(url, timeout):
    try:
        with urllib.request.urlopen(url, timeout=timeout) as conn:
            # 解码字节数据为字符串,编码可根据实际文件调整
            content = conn.read().decode('utf-8')
            # splitlines()自动处理各种换行符(\n、\r\n等),返回行列表长度即为行数
            return len(content.splitlines())
    except UnicodeDecodeError:
        # 处理编码错误,可根据实际情况调整编码尝试或返回错误信息
        return "编码错误,无法解析文件内容"
    except Exception as exc:
        raise exc

if __name__ == "__main__":
    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        future_to_url = {executor.submit(count_lines, url, 60): url for url in URLS}
        for future in concurrent.futures.as_completed(future_to_url):
            url = future_to_url[future]
            try:
                line_count = future.result()
            except Exception as exc:
                print(f"{url} 执行出错: {exc}")
            else:
                if isinstance(line_count, int):
                    print(f"{url} 的行数为: {line_count}")
                else:
                    print(f"{url} {line_count}")

关键调整说明

  1. 重命名函数为count_lines,贴合功能定位;
  2. 读取字节数据后添加decode('utf-8')转换为字符串,若文件使用其他编码(如gbk),需替换为对应编码;
  3. 使用splitlines()方法分割行,兼容不同操作系统的换行格式,统计结果更准确;
  4. 增加编码错误捕获,避免因文件编码不匹配导致程序崩溃;
  5. 调整输出逻辑,明确展示每个URL的行数或错误信息。

内容的提问来源于stack exchange,提问作者FancyPantsFlower

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:45:23