Как передать строку через STDIN в терминальную команду, выполняемую в скрипте Python?
Мне нужно сгенерировать схему Postgres из кадра данных. Я обнаружил, что библиотека csvkit подходит к соответствующим типам данных. Я могу запустить csvkit и сгенерировать схему postgres через csv на своем рабочем столе через терминал с помощью этой команды, найденной в docs:
csvsql -i postgresql myFile.csv
csvkit docs - 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()
заранее спасибо
1 ответ
Вы не можете передать такую большую строку через командную строку! Вы должны сохранить данные в файл и передать его путь к 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")