【问题标题】:How to pass string via STDIN into terminal command being executed within python script?如何通过 STDIN 将字符串传递给在 python 脚本中执行的终端命令?
【发布时间】:2018-07-15 13:41:27
【问题描述】:

我需要从数据框生成 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()

提前谢谢你

【问题讨论】:

    标签: python-3.x postgresql stdin csvkit


    【解决方案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")
    

    【讨论】:

    • 我已经可以做到这一点,并使用 `to_csv('file/path') 将数据帧直接写入 csv。我真的很想传递一个字符串,这样我就可以接收其他数据源并提高处理效率。
    • 你认为我可以用这种方式传递一个字符串吗? stackoverflow.com/questions/163542/…
    • 说实话-我不确定。有关将 STDIN 传递给 csvkit 的语法,请参阅 csvkit.readthedocs.io/en/1.0.2/…。标准输入通道与参数列表不同,我认为您不应该达到限制。虽然我会测试性能,但我不确定 Python 是否能比简单地保存和加载文件更快地处理这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2017-04-20
    • 1970-01-01
    相关资源
    最近更新 更多