我正在尝试将一个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
任何帮助将不胜感激。
答案 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"
创建一个字符串s
。 s
的第二个字符,即s[1]
,是ü
。
现在,我听到您想知道:s
的第二个字符是ü
,它假定采用什么编码?您在问错问题。字符串是字符串,而不是字节字符串。字符串没有编码,只是字符串。
当然,Python在内部以内部表示形式保存字符串,但是您只需要关心它如何存储数字3.14159即可。这是一个实现细节。
当您告诉Python some_bytes_object.decode('utf-8')
时,这意味着“采用此字节序列,假定它是用UTF-8编码的字符串,然后让我得到该字符串”。
对于您而言,您需要做的只是.decode('win-1252')
。如果要让程序接受任何类型的编码,则需要找到一种方法让程序获取有关每个文件的编码方式的信息。
如果这种解释不够清楚,我在demystifying encodings上发表的一系列博客文章可以提供帮助。