Python中转换已下载PDF为CSV:glob无法识别目录文件问题
问题分析与修复方案
你的代码存在多个关键问题,导致glob无法识别文件且转换逻辑错误,以下是具体问题和修复方案:
核心问题点
- 未导入
os模块:代码中使用os.chdir(path)但未导入os,会触发NameError。 - 文件类型匹配错误:你下载的是PDF文件,但glob却查找
*.csv文件,完全不匹配。 - 路径转义错误:字符串
'mypath\*.csv'中的反斜杠是Python转义字符,会导致路径解析异常,需改用原始字符串或双反斜杠。 - 下载文件无扩展名:命名为
URL1、URL2的文件没有.pdf后缀,glob匹配*.pdf时会忽略这些文件。 - 转换逻辑颠倒:你试图把CSV转成CSV,实际需求是将PDF转换为CSV。
修复后的代码
import requests import os import glob import tabula # 创建URL与带PDF后缀的文件名列表 urls = [('report_2023.pdf', 'https://www.health.ny.gov/statistics/sparcs/reports/compliance/2023/c2023_sub012023_000401.pdf'), ('report_2022.pdf', 'https://www.health.ny.gov/statistics/sparcs/reports/compliance/2022/c2022_sub012023_000401.pdf')] # 遍历URL并下载PDF文件 path = 'mypath' # 确保目标目录存在,避免切换目录失败 os.makedirs(path, exist_ok=True) os.chdir(path) def download_pdf(file_info): filename, url = file_info r = requests.get(url, stream=True) # 检查请求是否成功,失败则抛出异常 r.raise_for_status() with open(filename, 'wb') as f: # 分块下载更高效稳定 for chunk in r.iter_content(chunk_size=8192): f.write(chunk) for item in urls: download_pdf(item) # 遍历目录中的PDF文件并转换为CSV for pdf_file in glob.glob('*.pdf'): # 生成对应CSV文件名,避免冗余后缀 csv_file = os.path.splitext(pdf_file)[0] + '.csv' tabula.convert_into(pdf_file, csv_file, output_format='csv', pages='all')
额外优化说明
- 添加
os.makedirs(path, exist_ok=True):自动创建目标目录,避免因目录不存在报错。 - 使用
r.iter_content()分块下载:相比逐字节写入,更适合大文件下载,稳定性更高。 - 增加请求状态检查:下载失败时直接抛出异常,便于快速排查问题。
- 规范文件命名:给下载文件添加
.pdf后缀,确保glob能正确匹配。 - 生成合理CSV文件名:避免出现
xxx.pdf.csv这类冗余文件名。
内容的提问来源于stack exchange,提问作者6114617
相关产品推荐
相关产品推荐

