gpt4 book ai didi

python - 多记录上传到postgres

转载 作者:行者123 更新时间:2023-11-29 13:21:51 24 4
gpt4 key购买 nike

我有一系列包含一些数据的 .csv 文件,我想要一个 Python 脚本来打开它们,进行一些预处理,然后将处理后的数据上传到我的 postgres 数据库。

我已经基本完成了,但我的上传步骤不起作用。我确定我缺少的东西很简单,但我就是找不到。如果您能提供任何帮助,我将不胜感激。

代码如下:

import psycopg2
import sys
from os import listdir
from os.path import isfile, join
import csv
import re
import io

try:
con = db_connect("dbname = '[redacted]' user = '[redacted]' password = '[redacted]' host = '[redacted]'")
except:
print("Can't connect to database.")
sys.exit(1)
cur = con.cursor()

upload_file = io.StringIO()

file_list = [f for f in listdir(mypath) if isfile(join(mypath, f))]
for file in file_list:
id_match = re.search(r'.*-(\d+)\.csv', file)
if id_match:
id = id_match.group(1)
file_name = format(id_match.group())
with open(mypath+file_name) as fh:
id_reader = csv.reader(fh)
next(id_reader, None) # Skip the header row
for row in id_reader:
[stuff goes here to get desired values from file]
if upload_file.getvalue() != '': upload_file.write('\n')
upload_file.write('{0}\t{1}\t{2}'.format(id, [val1], [val2]))

print(upload_file.getvalue()) # prints output that looks like I expect it to
# with thousands of rows that seem to have the right values in the right fields

cur.copy_from(upload_file, '[my_table]', sep='\t', columns=('id', 'col_1', 'col_2'))
con.commit()

if con:
con.close()

这运行没有错误,但是 psql 中的选择查询仍然显示表中没有记录。我错过了什么?

编辑:我最终放弃并将其写入临时文件,然后上传文件。这没有任何问题......我显然不想拥有临时文件,所以如果有人看到问题,我很乐意提出建议。

最佳答案

当您写入 io.StringIO(或任何其他文件)对象时,文件指针保持在最后写入的字符的位置。所以,当你这样做的时候

f = io.StringIO()
f.write('1\t2\t3\n')
s = f.readline()

文件指针停留在文件末尾,s 包含一个空字符串。


读取(不是getvalue)内容,您必须将文件指针重新定位到开头,例如使用 seek(0)

upload_file.seek(0)
cur.copy_from(upload_file, '[my_table]', columns = ('id', 'col_1', 'col_2'))

这允许 copy_from 从头开始​​读取并导入 upload_file 中的所有行。


不要忘记,您读取所有文件并将其保存在内存中,这可能适用于单个小型导入,但在进行大型导入或并行导入时可能会成为问题。

关于python - 多记录上传到postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40349350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com