从具有许多不同列但相似数据的csv文件中批量导入数据到PostgreSQL

问题描述 投票:0回答:1

我想编写一个脚本,用于将数百个具有不同列/格式的 csv 文件批量导入 PostgreSQL

如何使用 csv 文件将具有不同列/格式的数据批量导入到 postgresql 上的另一个表中?

例如下面的代码概述了如何将数据批量导入到SQL中,但不知道如何导入具有不同列的数据。

那么我们如何修改下面的代码来完成这个任务呢?我是 postgresql 新手,所以请原谅我的愚蠢。

import pandas as pd
import psycopg2
from io import StringIO

# Database connection parameters
db_params = {
    "dbname": "your_database",
    "user": "your_username",
    "password": "your_password",
    "host": "your_host",
    "port": "your_port",
}

# File path to your CSV
csv_file = "your_file.csv"
table_name = "your_table_name"

# Connect to PostgreSQL
conn = psycopg2.connect(**db_params)
cur = conn.cursor()

# Step 1: Read CSV into Pandas DataFrame
df = pd.read_csv(csv_file)

# Step 2: Create table dynamically
columns = df.columns
col_str = ", ".join([f'"{col}" TEXT' for col in columns])  # Assuming TEXT for simplicity
create_table_query = f"CREATE TABLE IF NOT EXISTS {table_name} ({col_str});"
cur.execute(create_table_query)
conn.commit()

# Step 3: Use COPY to load the data
buffer = StringIO()
df.to_csv(buffer, index=False, header=False)  # Write DataFrame to buffer without header
buffer.seek(0)

# COPY data into the table
copy_query = f"COPY {table_name} ({', '.join(columns)}) FROM STDIN WITH CSV"
cur.copy_expert(copy_query, buffer)
conn.commit()

# Close connections
cur.close()
conn.close()

print(f"Data from {csv_file} has been successfully imported into {table_name}.")

我尝试聚合所有列名称,并能够创建一个包含所有列名称的文件,但不确定如何将数据与列对齐。

python postgresql
1个回答
0
投票

这个想法不错,但如果我理解正确的话,你将“数百个CSV”复制到一个文件中?这是一个坏主意!您必须在外部迭代中解决它才能遍历文件并连续创建具有相同文件名的表。 CSV 中的列数由您的程序决定。 您应该以这样的方式构建循环:输入文件所在的路径并遍历它们,为每个文件创建表并上传数据。

© www.soinside.com 2019 - 2024. All rights reserved.