在plpython3u中导入同服务器CSV至PostgreSQL时遭遇pandas解析错误的求助
在plpython3u中导入同服务器CSV至PostgreSQL时遭遇pandas解析错误的求助
看起来你在通过plpython3u函数用pandas读取服务器上的CSV文件导入PostgreSQL时遇到了头疼的解析问题,我来帮你梳理下可能的原因和解决思路~
首先先明确你遇到的错误信息:
ERROR: pandas.errors.ParserError: Error tokenizing data. C error: Buffer overflow caught - possible malformed input file.
你的函数代码如下:
CREATE OR REPLACE FUNCTION test_00.file() RETURNS text LANGUAGE 'plpython3u' AS $BODY$ import pandas as pd plan = pd.read_csv('/path/file.csv') plan.columns = ['division', 'deposit', 'credits', 'credit_cards', 'med_cards', 'smart_cards', 'pidtrumka_cards', 'curr_cash', 'fop', 'travel_risk', 'green_card', 'armour_protect', 'doc_online', 'service_ua', 'empty1', 'empty2', 'empty3', 'empty4', 'empty5'] print(plan) $BODY$;
这个Buffer overflow的解析错误,大概率是CSV文件本身格式有问题,或者pandas的默认解析规则不匹配你的文件,下面是具体的排查和解决步骤:
一、先排查CSV文件本身的格式问题
这个错误最常见的诱因是CSV格式不符合预期:
- 检查是否有行的字段数量和你定义的19列(你的
columns列表有19个元素)不匹配,比如某一行多打了逗号、少打了逗号,导致pandas解析时字段数和列数对不上 - 检查单元格内容是否有未正确转义的特殊字符:比如单元格里包含逗号、换行符,但没有用双引号把整个单元格括起来,这会让pandas误判行的边界
- 可以用文本编辑器(比如vim、Notepad++)打开CSV,或者用Excel导入后查看有没有异常行,重点看那些看起来“错位”的行
二、调整pandas.read_csv的解析参数
默认的pandas C解析引擎对格式错误比较敏感,你可以通过添加参数来兼容这些问题:
- 切换到Python解析引擎:
engine='python',它对格式问题的容忍度更高,虽然速度稍慢,但能避免很多Buffer overflow的错误 - 跳过有问题的行并提示:
error_bad_lines=False, warn_bad_lines=True,这样pandas会跳过解析失败的行,同时输出对应的行号,方便你定位问题行 - 明确指定分隔符:如果你的CSV不是用逗号分隔的(比如制表符、分号),一定要用
sep='分隔符'指定,比如制表符是sep='\t'
修改后的读取代码示例:
plan = pd.read_csv('/path/file.csv', engine='python', error_bad_lines=False, warn_bad_lines=True)
三、确认文件权限和路径
别忽略基础问题:PostgreSQL的运行用户(通常是postgres用户)必须有权限读取/path/file.csv这个文件。你可以在服务器上切换到postgres用户,执行cat /path/file.csv测试能不能正常读取,如果权限不足,需要给文件添加对应的读取权限。
四、分步调试排除环境问题
如果上面的方法都不行,可以先脱离plpython3u环境测试:
- 在服务器上用Python环境直接运行读取CSV的代码,看能不能成功
- 如果单独Python环境能读取,那可能是plpython3u的pandas版本和你本地的版本有差异,可以在函数里添加
print(pd.__version__)查看版本,再对比本地Python的pandas版本,必要时升级plpython3u的pandas包
备注:内容来源于stack exchange,提问作者Sterioz
相关产品推荐
相关产品推荐

