【发布时间】:2021-08-02 20:56:45
【问题描述】:
我正在尝试使用复制语句将我在 Python 中创建的 CSV 复制到 PSQL 数据库,并收到错误 PostgreSQL: character with byte sequence 0xc2 0x81 in encoding “UTF8” has no equivalent in encoding “WIN1252”。
原始文件是 UTF-8,我相当确定我创建并尝试复制的文件是用 UTF-8 编码的。我相信我在 Python 代码中添加了正确的参数:
def process_csvs():
with open('movie_file.csv', mode='w', encoding='utf-8') as movie_file:
movie_writer = csv.writer(movie_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
with open('movie_basics.tsv', encoding='utf-8') as csv_file:
csv_reader = csv.reader(csv_file, delimiter="\t")
for row in csv_reader:
...
当我在记事本中打开输出文件时,它说编码是 UTF-8。
我的COPY语句如下:
COPY movies(movie_id, title, year, runningtime) FROM 'C:\Users\Public\Documents\movie_file.csv' DELIMITER ',' CSV HEADER NULL AS 'Nul
l';
我相信目前给我带来麻烦的字符是重音 A 在:tt0000676,Don Álvaro o la fuerza del sino,1908,Null
有人知道我的配置如何将它编码为 WIN1252 以及任何修复它的方法吗?谢谢!
编辑:
我重新创建了数据库:
CREATE DATABASE "scratch"
WITH TEMPLATE template0
ENCODING 'UTF8'
LC_COLLATE = 'en_US.UTF-8'
LC_CTYPE = 'en_US.UTF-8';
据我所知,所涉及的所有内容都以 UTF-8 编码,可能在命令行之外,我相信它默认为 WIN1252。我对这一切都很陌生。我确实尝试在我的 Python 脚本中使用 WIN1252 编码编写文件,但是原始数据是 UTF-8 编码的,并且脚本在尝试进行转换时抛出了错误。
【问题讨论】:
-
我要说问题出在数据库编码端。什么版本的 Postgres,你在什么操作系统和版本上运行它?在
psql中show lc_collate;和show lc_ctype;返回什么?添加信息作为问题的更新。 -
今天早上我花了几个小时在它上面工作,然后导入工作。但是,如果我想提出任何疑问,您在此处提到的内容似乎很重要。 lc_collate 和 lc_ctype 都是 WIN1252,这似乎是我现在遇到相同错误的原因,但是将 UTF-8 转换回 1252 时出现问题。我已经看到了一些关于在创建数据库时设置语言环境的事情,并且会看起来现在进入它。谢谢!
-
目前比较简单的方法似乎是在WIN1252中获取CSV文件。
-
我确实将语言环境更改为 UTF-8,当我尝试进行查询时它给了我同样的错误。我无法获得编码为 WIN1252 的原始数据,而且我似乎找不到使用 Python 脚本将其转换为 WIN1252 的方法。就目前而言,我的数据在数据库中,我认为我的问题在于尝试从命令行进行查询,我认为我不需要这样做。我想我会把它留在这里。感谢您一直坚持我。
-
错过了编辑我上一条评论的截止日期。澄清我无法在 Python 中成功转换某些字符,并说我将保留这个问题,因为当前的解决方案来自 pgAdmin,并且无法从 COPY 命令导入。
标签: python postgresql encoding