defupload_pdf_files(api_url, paths, area): """ 批量上传指定路径下的所有 PDF 文件到服务器 参数: api_url: str,PDF 文件上传接口地址 paths: str,待上传文件夹路径 area: str,城市名称,用于拼接上传接口地址 返回值: 一个包含元组 (data, order_id) 的列表,其中 data 为成功上传单个文件后接口返回的数据, order_id 为该文件所在文件夹的名称。 """ global order_id ifnot check_path(paths): return
area_dict = {"重庆": "chongqing", "四川": "sichuan", "深圳": "shenzhen_split"} city = area #city = paths.split('\\')[2] # 使用反斜杠来分隔路径,这里需要加反斜杠转义符号 api_url = f"{api_url}/pdf_analysis_{area_dict[area]}"
result_list = [] for root, dirs, files in os.walk(paths): for dir_name in dirs: order_id = os.path.join(dir_name) for file_name in files: #判断文件后缀是否为pdf文件 if file_name.endswith('.pdf'): file_path = os.path.join(root, file_name) # 通过api接口获取信息 result = upload_pdf_file(api_url, file_path) if result: result_list.append([order_id, result])
try: response = requests.post(url=api_url, files=files, timeout=3) time.sleep(1) if response.status_code == 200: data = response.json() result.append(path.name) result.append(data) return result else: # 将请求失败的文件名称和地区写入error.csv文件 print(f"请求失败:{response.text}") withopen('./error.csv', 'a+', encoding='utf-8') as f: f.write(city + ",") f.write(path.name) f.write('\n') f.seek(0) returnFalse except requests.exceptions.RequestException as e: print(e) returnFalse
pymysql使用
通过连接数据库进行数据写入
1 2 3 4 5 6 7
with pymysql.connect( host='localhost', port=3306, user='root', password='fy0825...', db='csp_syx_pdf' ) as conn:
通过老师编写的一个 DataWriter类,对数据库进行连接与写入,进行了简单的修改,使用 with 语句来自动管理数据库连接的打开和关闭。在 write 方法中,类根据传入的参数对数据进行了清理,并将其格式化为 MySQL 可以识别的形式,然后执行插入操作,最后提交事务。如果出现任何异常,则回滚事务并打印错误消息。
收获
利用API对pdf文件进行解析,得到 json 格式的数据,其中利用了 os 库对文件进行读取,
用os.walk生成指定树中每个目录的值元组,包括目录路径、子目录列表和文件列表。
root是当前目录的路径。
dirs是当前目录下的子目录列表。
files是当前目录下的文件列表
1 2 3
for root, dirs, files in os.walk(paths): for dir_name in dirs: order_id = os.path.join(dir_name)
# 定义目标路径 path = r"D:\税区" # 获取目标路径下所有一级子文件夹的名称 dirs = [f for f in os.listdir(path) if os.path.isdir(os.path.join(path, f))] # 获取其下所有二级子文件夹的名称 two_dirs = [os.path.join(path, f, subf) for f in dirs for subf in os.listdir(os.path.join(path, f)) if os.path.isdir(os.path.join(path, f, subf))] for folder in two_dirs: print(folder) area = folder.split('\\')[2] print(area) result = upload_pdf_files(api_url, folder, area)