我需要从数据帧生成postgres模式。我发现csvkit库更接近匹配的数据类型。我可以通过docs中找到的以下命令,通过终端运行csvkit并通过桌面上的csv生成postgres模式:
csvsql -i postgresql myFile.csv
csvkit文档-https://csvkit.readthedocs.io/en/stable/scripts/csvsql.html
然后我可以通过以下代码在脚本中运行终端命令:
import os
a=os.popen("csvsql -i postgresql Desktop/myFile.csv").read()
但是,我有一个数据框,已将其转换为csv字符串,并且需要从字符串中生成模式,如下所示:
csvstr = df.to_csv()
在文档中它说在位置参数下:
The CSV file(s) to operate on. If omitted, will accept
input on STDIN
如何将变量csvstr
作为变量传递到代码行a=os.popen("csvsql -i postgresql csvstr").read()
中?
我尝试执行以下代码行,但出现错误OSError: [Errno 7] Argument list too long: '/bin/sh'
:
a=os.popen("csvsql -i postgresql {}".format(csvstr)).read()
提前谢谢
答案 0 :(得分:2)
您不能通过命令行传递这么大的字符串!您必须将数据保存到文件并将其路径传递到csvsql
。
import csv
csvstr = df.to_csv()
with open('my_cool_df.csv', 'w', newline='') as csvfile:
csvwriter= csv.writer(csvfile)
csvwriter.writerows(csvstr)
及以后:
a=os.popen("csvsql -i postgresql my_cool_df.csv")