我有成千上万个相关的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('_'))
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()
答案 0 :(得分:1)
根据大多数DB-API坚持遵守的PEP-249(Python数据库API规范),包括pymssql
,cx_oracle
,ibm_db
,pymysql
,{{ 1}}和sqlite3
中的pyodbc
中要作为预准备语句中的参数绑定的变量将进入cur.execute(query, params)
的第二个参数。
具体来说,在迭代过程中将文件级变量与CSV变量组合在一起,并将它们作为参数列表或元组传递给执行调用。下面使用csv.DictReader
方法,从csv数据构建每行的字典。
注意::下面的查询保留了主键 serial_id ,该键应通过Postgres表中的序列填充。
psycopg2