如何使用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}")
关键调整说明
- 重命名函数为
count_lines,贴合功能定位; - 读取字节数据后添加
decode('utf-8')转换为字符串,若文件使用其他编码(如gbk),需替换为对应编码; - 使用
splitlines()方法分割行,兼容不同操作系统的换行格式,统计结果更准确; - 增加编码错误捕获,避免因文件编码不匹配导致程序崩溃;
- 调整输出逻辑,明确展示每个URL的行数或错误信息。
内容的提问来源于stack exchange,提问作者FancyPantsFlower
相关产品推荐
相关产品推荐

