繁体   English   中英

Python psql \\将CSV复制到远程服务器

[英]Python psql \copy CSV to remote server

我正在尝试将python 3.6的csv(具有标头和引号“)复制到远程Postgres 10服务器上的表中。它是大型CSV文件(2.5M行,800MB),而我以前将其导入到dataframe,然后使用dataframe.to_sql,这非常占用内存,因此我转而使用COPY。

将COPY与psycopg2或sqlalchemy一起使用可以正常工作,但是远程服务器无权访问本地文件系统。

在终端中使用psql,我已成功运行以下查询以填充表。 我认为psycopg2或sqlalchemy无法使用\\ copy。

\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '"' NULL ''

但是,当我尝试使用如下所示的单行psql -c命令时,它不起作用并且出现错误:

错误:COPY引号必须是一个单字节字符。

psql -U user -h ip -d db -w pw -c "\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '"' NULL ''"

你能告诉我为什么会这样吗?

与只需要打开终端并执行我不确定如何执行的命令相比,使用python中的subprocess模块​​执行此单行-c psql语句会更容易。 如果您可以提出解决方法或其他方法,那就更好了。

====== Per Andrew的建议是在命令行中转义引号字符。 但是,当像下面这样在python中实现它时,会出现一个新错误:

/ bin / sh:-c:第0行:寻找匹配的''''时出现意外的EOF

/ bin / sh:-c:第1行:语法错误:文件意外结束

"\"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\"' NULL ''\""
cmd = f'psql -U {user} -h {ip} -d {db} -w {pw} -c {copy_statement}'
subprocess.call(cmd, shell=True)

如果可以避免,请不要使用shell=True 最好自己标记命令以帮助sh。

subprocess.call(["psql", "-U", "{user}", "-h", "{ip}", "-d", "{db}", "-w", "{pw}", "-c", "{copy statement}"])

在这种情况下,您的copy语句可能是原样传递给psql的,因为没有shell引用问题需要考虑。 (NB仍必须为python引用此字符串,因此字符串将保持原样)。


如果仍然要使用shell=True则必须对python shell都使用字符串常量

"\"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\\\"' NULL ''\""

将在python中创建一个字符串

"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\"' NULL ''\"

这是我们首先发现需要在外壳上使用的内容!


编辑 (从注释中澄清)

subprocess.call ,当不使用shell=True ,采用可迭代的参数。

所以你可以

psql_command = "\"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\\\"' NULL ''\""
# user, hostname, password, dbname all defined elsewhere above.
command = ["psql",
    "-U", user,
    "-h", hostname,
    "-d", dbname,
    "-w", password,
    "-c", psql_command,
]

subprocess.call(command)

请参阅https://docs.python.org/2/library/subprocess.html#subprocess.callhttps://docs.python.org/3/library/subprocess.html#subprocess.call

额外编辑:-请注意,为避免注入外壳,您应使用此处描述的方法。 请参阅https://docs.python.org/2/library/subprocess.html#frequently-used-arguments的警告部分

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM