Python 在psycopg2/postgres命令中使用外部变量
我有数千个相关的CSV,我想将它们的内容写入一个Postgres表,其中包含关于每一行来自何处的元数据 我不清楚如何将脚本顶部附近创建的变量写入表中 有人能提供建议吗Python 在psycopg2/postgres命令中使用外部变量,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我有数千个相关的CSV,我想将它们的内容写入一个Postgres表,其中包含关于每一行来自何处的元数据 我不清楚如何将脚本顶部附近创建的变量写入表中 有人能提供建议吗 target_directory = Path(sys.argv[1]).resolve() # FOR THE WAC AND RAC DATASETS for file in target_directory.rglob('*.csv'): print(str(file.stem).split('_'))
target_directory = Path(sys.argv[1]).resolve()
# FOR THE WAC AND RAC DATASETS
for file in target_directory.rglob('*.csv'):
print(str(file.stem).split('_'))
state = str(file.stem).split('_')[0]
data_category = str(file.stem).split('_')[1]
workforce_segment = str(file.stem).split('_')[2] # THIS IS DIFFERENT FROM THE O-D DATASETS
job_type = str(file.stem).split('_')[3]
year = str(file.stem).split('_')[4]
print('Writing: ' + str(file.name))
# MAKE SURE THIS IS THE RIGHT TABLE FOR THE FILES
cur.execute(create_table_WAC)
with open(file,'r') as file_in:
# INSERT THE DATA IN USING THE COLUMN NAMES....SO YOU CAN ADD YOUR SPLIT STRING INFO ABOVE.....
# MAKE SURE THIS HAS THE RIGHT TABLE NAME IN THE COPY STATEMENT
cur.execute("INSERT INTO opendata_uscensus_usa_lodes_wac (serial_id, state_name, data_category, workforce_segment, job_type, year, w_geocode, C000, CA01, CA02, CA03, CE01, CE02) \
VALUES (%s, state_name, data_category, workforce_segment, job_type, year, %s, %s, %s, %s, %s, %s)")
conn.commit()
conn.close()
根据大多数数据库API遵循的(Python数据库API规范),包括pymssql
,cx\u oracle
,ibm\u DB
,pymysql
,sqlite3
,以及pyodbc
,在psycopg2
中,要绑定为准备语句中的参数的变量将进入的第二个参数
具体来说,在迭代期间将文件级变量与CSV变量组合起来,并将它们作为参数列表或元组传递到执行调用中。下面使用的方法是从csv数据构建每一行的字典
注意:下面的查询省略了主键serial\u id,它应该通过Postgres表中的序列填充
for file in target_directory.rglob('*.csv'):
print(str(file.stem).split('_'))
# FILE LEVEL VARIABLES
state_name = str(file.stem).split('_')[0]
data_category = str(file.stem).split('_')[1]
workforce_segment = str(file.stem).split('_')[2]
job_type = str(file.stem).split('_')[3]
year = str(file.stem).split('_')[4]
# PREPARED STATEMENT
sql = """INSERT INTO opendata_uscensus_usa_lodes_wac
(state_name, data_category, workforce_segment,
job_type, year, w_geocode, C000, CA01, CA02, CA03, CE01, CE02)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"""
with open(file,'r') as file_in:
# ITERATE THROUGH FOR CSV VARIABLES
reader = csv.DictReader(file_in)
for row in reader:
cur.execute(sql, (state,data_category,workforce_segment,job_type,year,
row['w_geocode'], row['C000'], row['CA01'],
row['CA02'], row['CA03'], row['CE01'], row['CE02'])
)
conn.commit()
如何在循环的每次迭代中创建一个表,但在每个循环中插入一个表?这将留下许多空表。@Parfait-非常好的一点…以前没有捕捉到这一点…我基本上理解这一点--我可以看到它如何从python输入值--但我对数据如何从表(和主键列)中来感到困惑我不理解你的问题:来自表格的数据最终会出现在表格中。你能重新措辞吗?我希望您不要混淆与列同名的变量。参数中使用的Python变量可以命名为任何名称。一些值(关于文件的元数据)来自Python脚本,一些值来自CSV。我不明白CSV值如何在表中结束。请显示CSV。您需要遍历它的行。有很多这样的例子,我在原始文章中添加了示例行段。
state\u name、data\u category、workforce\u segment、job\u type、year
变量从文件名中提取,而不是从CSV中提取。