Windows下DuckDB初学者遇无详情IOException,求排查方向
排查DuckDB Windows下CSV转Parquet的IOException
以下是几个常见的排查方向和解决方法:
路径格式适配问题
Windows系统默认使用反斜杠\作为路径分隔符,代码中手动拆分路径时用了正斜杠/,可能导致DuckDB解析路径出错。建议用os.path模块处理路径,自动适配系统格式:import os import glob PATH = 'stock_market_data/nasdaq' parquet_dir = os.path.join(PATH, 'parquet') os.makedirs(parquet_dir, exist_ok=True) # 确保目标目录存在 for filename in glob.iglob(os.path.join(PATH, 'csv', '*.csv')): base_name = os.path.splitext(os.path.basename(filename))[0] dest = os.path.join(parquet_dir, f'{base_name}.parquet') # 后续执行SQL逻辑目标目录未创建
DuckDB不会自动创建输出目录,如果parquet文件夹不存在,写入时会抛出IOException。先手动创建该目录,或者在代码中添加os.makedirs(parquet_dir, exist_ok=True)来自动创建(如上例)。文件权限或占用问题
- 检查CSV文件是否被其他程序(如Excel、记事本)占用,关闭后重试。
- 确认当前用户对CSV所在目录和Parquet输出目录有读写权限。
CSV内容解析错误
指定的dateformat='%d-%m-%Y'可能与实际CSV中的日期格式不匹配,或者存在无效日期值。可以单独测试单个CSV的读取:test_result = conn.execute(f""" SELECT * FROM read_csv('{filename}', header=True, dateformat='%d-%m-%Y', columns={{'Date': 'DATE', 'Low': 'DOUBLE', 'Open': 'DOUBLE', 'Volume': 'BIGINT', 'High': 'DOUBLE', 'Close': 'DOUBLE', 'AdjustedClose': 'DOUBLE'}}, filename=True) """).df() print(test_result.head())如果此步骤报错,说明是CSV数据格式问题,需要调整日期格式参数或清理脏数据。
SQL字符串拼接的转义问题
如果CSV文件名包含空格、特殊字符(如&、@),直接拼接SQL语句会导致语法错误。改用参数化查询避免转义问题:conn.execute(""" COPY (SELECT * FROM read_csv(?, header=True, dateformat='%d-%m-%Y', columns={'Date': 'DATE', 'Low': 'DOUBLE', 'Open': 'DOUBLE', 'Volume': 'BIGINT', 'High': 'DOUBLE', 'Close': 'DOUBLE', 'AdjustedClose': 'DOUBLE'}, filename=True)) TO ? (FORMAT 'parquet') """, (filename, dest))DuckDB版本兼容性
尝试升级到最新稳定版DuckDB,或者降级到教程对应的版本,Windows平台的旧版本可能存在文件IO相关的bug。
内容的提问来源于stack exchange,提问作者Andrey Morais Labanca
相关产品推荐
相关产品推荐

