将CSV文件上传到postgres DB

时间:2016-06-17 09:03:56

标签: python postgresql csv encode

尝试使用Python2.7将CSV文件上传到Postgres数据库时,我一直收到UnicodeEncode错误

首先我以CSV格式创建文件。该文件具有非拉丁字符,这就是我下载它并编码第二列的原因:

writer = csv.writer(response, dialect='excel')
writer.writerow(tuple(corresponding_data[btn]["columns"].split(',')))

 for row in rows:
        field_1 = row[0]
        field_2 = row[1].encode(encoding='UTF-8')
        fields = [field_1, field_2]
        writer.writerows([fields])

创建文件时没有错误。当我在Excel中打开它时,我发现有一些值,如:Dajï¿ï¿

为了上传文件并将其保存在Postgres的表格中,我使用名为:CSVKit的python模块。

这就是我的所作所为:

import codecs
f = codecs.open(absolute_base_file, 'rb', encoding='utf-8')
delimiter = ","
no_header_row = False
try:
    csv_table = table.Table.from_csv(f, name=table_name_temp, no_header_row=no_header_row, delimiter=delimiter)

虽然我指定了编码,但我一直收到错误:

<type 'exceptions.UnicodeEncodeError'>

我不知道还有什么可以尝试。

EDITED

在检查数据库中的值后,我看到他们确实没有任何拉丁字符,但是有白色空格的值,当我保存它们时,它们会被单独编码(空白)。 我认为这是造成这个问题的原因。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用unicodecsv代替内置csv

答案 1 :(得分:0)

毕竟,在将值写入CSV之前,我已将这些值展平。 我使用unidecode模块如下:

from unidecode import unidecode

for row in rows:
        field_1 = row[0]
        field_2 = unidecode(row[1]).encode(encoding='UTF-8') # LINE CHANGED
        fields = [field_1, field_2]
        writer.writerows([fields])
    return response

虽然不是永久解决方案,但现在这解决了我的问题。