【问题标题】:Dynamically handling data columns in csv for import to Postgresql动态处理 csv 中的数据列以导入 Postgresql
【发布时间】:2014-01-03 00:12:04
【问题描述】:

我是 python (3) 的新手,很难找到有关如何处理以下场景的相关示例。我知道这即将成为一个“什么是最好的”问题,但希望有一个明显合适的方法来解决这个问题。

我有包含时间戳的 csv 数据文件,然后是至少一列数据,其名称由主列表定义(即所有可能的列标题都是已知的)。例如:

文件1.csv

date-time, data a, data b
2014-01-01, 23, 22
2014-01-01, 23, 22d

文件2.csv

date-time, data d, data a
2014-01-01, 99, 20
2014-01-01, 100, 22

我一直在兜圈子,试图了解何时将元组、列表和字典用于此类场景以导入 postgresql。由于列顺序可以更改并且列列表每次都不同(尽管总是来自主集),我不确定如何最好地生成包含时间戳和列的数据集,然后执行插入为未指定的列提供值的 postgresql 表。

鉴于列存在的动态特性以及需要维护与通过 psycopg 导入 Postgresql 的时间戳之间的关系,有什么建议?列表、列表列表、字典或元组?

我不是在乞求特定的代码,只是一些指导。谢谢。

【问题讨论】:

  • 插入是进入一个 postgresql 表,所有未指定的列都为空,还是进入不同的表?
  • 一个未指定列为空的表。感谢您寻求澄清。
  • 查看csv模块,它会为你省去很多痛苦。

标签: python postgresql csv python-3.x


【解决方案1】:

您可以使用csv 模块来解析输入文件,并且通过它的第一行,您可以使用列名和%s 而不是值来构建(准备)psycopg 插入语句。对于其余行,只需将行作为值执行此语句:

connect_string = 'dbname=test host=localhost port=5493 user=postgres password=postgres'
connection = psycopg2.connect(connect_string)
cursor = connection.cursor()
f = open(fn, 'rt')
try:
    reader = csv.reader(f)
    cols = []
    for row in reader:
        if not cols:
            cols = row
            psycopg_marks  = ','.join(['%s' for s in cols])
            insert_statement = "INSERT INTO xyz (%s) VALUES (%s)" % (','.join(cols), psycopg_marks)
            print(insert_statement)
        else:
            print(row)
            cursor.execute(insert_statement, row)
finally:
    f.close()

...

对于您的示例,您必须更正列名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    相关资源
    最近更新 更多