Python3中创建并逐行写入大文本文件的实现求助
先澄清:你的异常不是文件写入问题!
兄弟,仔细看你贴的异常栈,所有错误都出在HTTP请求和分块数据读取环节——从urllib/request.py到http/client.py的报错,是你用boilerpipe爬取网页时,服务器返回的分块数据不完整导致的IncompleteRead,和你写文件的代码半毛钱关系都没有!不过既然你提到了「循环中创建并写入大文本文件避免崩溃」的需求,我一起给你解决这两个问题。
一、核心需求:循环中安全写入大文本文件的正确姿势
你当前的代码用了open()+close(),但如果遇到异常可能会导致文件未关闭,而且一次性写入超大文本确实可能占用过多内存。推荐用**上下文管理器(with语句)**自动处理文件生命周期,同时分块写入大内容:
# 循环的每次迭代中执行这段代码 filename = f"{articleDate.title}-WC.txt" # with语句会自动帮你关闭文件,哪怕中途出错 with open(filename, 'wb') as fileW: # 先准备好要写入的内容(编码处理) text_bytes = getText.encode('utf-8', errors='replace').strip() date_bytes = str(articleDate.publish_date).encode('utf-8').strip() # 如果text_bytes特别大(比如几十MB以上),分块写入更稳妥 chunk_size = 1024 * 1024 # 每次写1MB的块 # 逐块写入文本内容 for i in range(0, len(text_bytes), chunk_size): fileW.write(text_bytes[i:i+chunk_size]) # 写入日期内容 fileW.write(date_bytes)
为什么这么写?
with语句是Python处理文件的标准最佳实践,自动处理打开/关闭,避免资源泄漏;- 分块写入大文本可以减少单次内存占用,避免因一次性加载超大内容导致的内存溢出;
- 即使
getText不是特别大,这种写法也更健壮,兼容各种文本大小。
二、解决你遇到的IncompleteRead网络异常
这个错误是爬取网页时的分块传输问题,大概率是目标服务器的连接中断、反爬限制,或者库的请求处理细节导致的。可以给请求加重试机制,比如指数退避重试:
import time from boilerpipe.extract import Extractor from http.client import IncompleteRead # 配置重试参数 MAX_RETRIES = 3 INITIAL_RETRY_DELAY = 2 # 第一次重试等待2秒 # 在调用Extractor的地方加重试逻辑 for attempt in range(MAX_RETRIES): try: extractor = Extractor(extractor='ArticleExtractor', url=urls) # 成功获取到内容后,再执行你的文件写入逻辑 break except IncompleteRead: if attempt < MAX_RETRIES - 1: # 指数退避:每次重试等待时间翻倍 delay = INITIAL_RETRY_DELAY * (2 ** attempt) print(f"请求失败,{delay}秒后重试...") time.sleep(delay) else: # 重试次数用完,还是失败就抛出异常 print("重试次数耗尽,请求失败") raise
额外建议:
如果boilerpipe底层用的是urllib,你也可以考虑换成更易用的requests库(如果能修改库的请求逻辑的话),requests对分块传输的处理更健壮,也更容易加超时、headers等参数绕过反爬。
内容的提问来源于stack exchange,提问作者Adrian Coutsoftides
相关产品推荐
相关产品推荐

