gpt4 book ai didi

python - 从 PostgreSQL COPY 从 stdin 获取数据时出错失败

转载 作者:行者123 更新时间:2023-11-29 12:15:26 25 4
gpt4 key购买 nike

我正在使用下面的 Python 脚本将放置在服务器中的 CSV 文件导入到 PostgreSQL 表中。

但我收到以下错误。

Error while fetching data from PostgreSQL COPY from stdin failed: error in .read() call: UnicodeDecodeError 'utf-8' codec can't decode byte 0xdf in position 1237: invalid continuation byte

CSV 文件在“ufl.csv: ISO-8859 文本,有很长的行”并且我的服务器是 UTF 编码,所以任何人都可以建议或帮助我修改下面的脚本而不显式地将 CSV 文件转换为UTF编码,可以用代码实现吗?

如果我将 CSV 文件的编码转换为 UTF,下面的代码工作正常。

import csv
import psycopg2
import time
import os
from datetime import datetime
import shutil

# File path.
filePath='''/Users/linu/Downloads/ufl.csv'''
dirName = '/Users/linu/Downloads/ufl_old_files/'

try:
conn = psycopg2.connect(host="localhost", database="postgres", user="postgres", password="postgres", port="5432")

print('DB connected')

except (Exception, psycopg2.Error) as error:
# Confirm unsuccessful connection and stop program execution.
print ("Error while fetching data from PostgreSQL", error)
print("Database connection unsuccessful.")
quit()

# Check if the CSV file exists.
if os.path.isfile(filePath):
try:
print('Entered loop')
sql = "COPY %s FROM STDIN WITH DELIMITER AS ';' csv header"
file = open('/Users/linu/Downloads/ufl.csv', "r")
table = 'staging.ufl_tracking_details'

with conn.cursor() as cur:
cur.execute("truncate " + table + ";")
print('truncated the table')
cur.copy_expert(sql=sql % table, file=file)
print('Data loaded')
conn.commit()
cur.close()
conn.close()

except (Exception, psycopg2.Error) as error:
print ("Error while fetching data from PostgreSQL", error)
print("Error adding information.")
quit()

if not os.path.exists(dirName):
os.mkdir(dirName)
print("Directory " , dirName , " Created ")
else:
print("Directory " , dirName , " already exists")
tstamp = os.path.getmtime(path)
timestamp_name=str(time.time())
os.rename(filePath,dirName + timestamp_name+'.csv')

else:
# Message stating CSV file could not be located.
print("Could not locate the CSV file.")
quit()

浏览了帖子并使用了少数提到的“copy_expert”,并尝试了一些其他解决方案,但没有一个解决。任何提示或建议都会有很大帮助。

注意:要求移植 CSV 文件,移植完成后将复制的 CSV 文件移动到一个文件夹并将其重命名为名称 + 时间戳。

提前致谢

最佳答案

游标中出现的 UnicodeDecodeError 表示编码不匹配。显然,该文件至少包含一个德语升号 (ß)。在 Latin-1、(ISO-8859-1) 和其他编码中,例如Cp1252,它被编码为 0xdf 而在 UTF-8 中它被编码为 0xc3 0x9f,因此 UTF-8 无法解码 Latin-1 编码的字符。

print(b'\xc3\x9f-'.decode("utf-8"))
# ß-
print(b'\xdf-'.decode("utf-8"))
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xdf in position 0: invalid continuation byte

注意:添加连字符 (-) 是为了强制出现 invalid continuation byte 错误。没有它,第二个打印将引发 UnicodeDecodeError unexpected end of data

出现这些错误是因为 UTF-8 的第一个字节在 0x7f 处用完,而 0xdf 在双字节编码字符的范围内。 UTF-8 需要多一个字节来解码此范围内的字符。
另见 this问答。

如果您不为 open() 提供编码调用,编码通过 locale.getpreferredencoding(False) 确定,它似乎会为您返回 UTF-8。

您必须将文件的编码传递给 open() 调用:

file = open(filePath, encoding="latin_1") 

关于python - 从 PostgreSQL COPY 从 stdin 获取数据时出错失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56833988/

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