在File.read()上使用编码UTF-8

时间:2019-04-11 08:14:16

标签: django python-3.x csv

我正在尝试将一个csv文件上传到Postgresql数据库,并且它被卡在问题末尾的错误中。原因是文件中包含Unicode字符,并且在Windows-1252中进行了编码。

这是我使用UTF-8解码文件的行。但是,我想基本上接受每种编码并将其解码为UTF-8或在读取文件时将编码设置为UTF-8,然后使用下面的一行进行解码。我没有使用open,因为我遇到了问题,而是使用InMemoryUploadedFile.read()(https://docs.djangoproject.com/en/2.2/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.read

csv_file.seek(0)
file = csv_file.read().decode('utf-8').splitlines()
reader = csv.reader(file)

这是错误,并且是由于以下字符:d�mpe

'utf-8' codec can't decode byte 0xb3 in position 13969: invalid start byte

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以使用errors parameter to .decode()来忽略编码错误或将其替换为替换字符。

csv_file.seek(0)
file = csv_file.read().decode('utf-8', errors='ignore').splitlines()
reader = csv.reader(file)

当然,最好将原始文件修复为真实的,正确的UTF-8。

答案 1 :(得分:1)

Python的bytes是一系列字节,而str是一个字符串。这意味着bytes对象的每个项目都是一个字节;而字符串对象的每个项目都是一个字符。

此:

s = "dümpe"

创建一个字符串ss的第二个字符,即s[1],是ü

现在,我听到您想知道:s的第二个字符是ü,它假定采用什么编码?您在问错问题。字符串是字符串,而不是字节字符串。字符串没有编码,只是字符串。

当然,Python在内部以内部表示形式保存字符串,但是您只需要关心它如何存储数字3.14159即可。这是一个实现细节。

当您告诉Python some_bytes_object.decode('utf-8')时,这意味着“采用此字节序列,假定它是用UTF-8编码的字符串,然后让我得到该字符串”。

对于您而言,您需要做的只是.decode('win-1252')。如果要让程序接受任何类型的编码,则需要找到一种方法让程序获取有关每个文件的编码方式的信息。

如果这种解释不够清楚,我在demystifying encodings上发表的一系列博客文章可以提供帮助。