使用sqlizer模块批量转XML到SQL Server的Python代码为何报错?
问题修复方案
错误原因
converter.convert()调用位置处于读取XML文件的with代码块外部,with语法会在代码块执行结束后自动关闭文件句柄,sqlizer上传文件时尝试读取已关闭的文件,触发I/O错误sqlizer.File()构造参数传递错误:第四个参数应为文件名字符串,原代码重复传入了文件对象- 代码逻辑错误:遍历文件列表的循环内未执行转换操作,仅对最后一次循环生成的converter做了调用,前面的XML文件均未处理,且没有保存转换后的SQL结果
- 原代码混入了运行时的打印输出内容,属于语法错误
修正后代码
import os import sqlizer # 替换为你自己的API_KEY sqlizer.config.API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' work_dir = 'C:/metadati/asim/asim_metadati/' os.chdir(work_dir) print("Current working directory: {0}".format(os.getcwd())) with open(os.path.join(work_dir, 'filelist.txt'), 'r') as fn: for line in fn: xml_filename = line.rstrip() # 跳过空行 if not xml_filename: continue # 读取XML文件 with open(xml_filename, mode='r', encoding='utf-8') as file_content: # 修正参数:第四个参数为文件名,第五个为目标表名 converter = sqlizer.File( file_handle=file_content, database_type=sqlizer.DatabaseType.SQLServer, file_type=sqlizer.FileType.XML, file_name=xml_filename, table_name='my_table' ) # 在文件句柄关闭前执行转换 converter.convert(wait=True) # 下载转换结果并保存为同名.sql文件 sql_content = converter.download_result_file().text sql_filename = os.path.splitext(xml_filename)[0] + '.sql' with open(sql_filename, 'w', encoding='utf-8') as sql_f: sql_f.write(sql_content) print(f"{xml_filename} 转换完成,结果已保存至 {sql_filename}")
修改说明
- 移除了代码中混入的打印输出冗余内容,修复语法错误
- 将转换、下载结果的逻辑移入XML文件读取的
with代码块内,确保文件句柄在上传时处于打开状态 - 修正了
sqlizer.File的参数传递,将第四个参数替换为正确的文件名字符串 - 增加了转换结果的本地保存逻辑,每个XML文件转换后会生成对应的.sql文件存放在同级目录
- 增加空行跳过逻辑,避免filelist.txt存在空行时触发异常
内容的提问来源于stack exchange,提问作者Enzog2
相关产品推荐
相关产品推荐

