【问题标题】:Using encode UTF-8 on File.read()在 File.read() 上使用编码 UTF-8
【发布时间】:2019-04-11 08:14:16
【问题描述】:

我正在尝试将 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

任何帮助将不胜感激。

【问题讨论】:

    标签: django python-3.x csv


    【解决方案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。

    【讨论】:

    • 好吧,所以它有点工作,但在数据库中是一个值'd�mpe',但它应该是 dümpe。有没有办法做到这一点?你能帮帮我吗?
    • 如果你说文件是windows-1252,那么一定是decode('windows-1252')!
    • 有没有办法对文件进行编码(例如windows-1252)并在python中将其转换为utf-8,然后我可以对其进行解码?
    • 一旦你从 Windows-1252 解码它,你就有了 unicode 数据,在你把它写回文件之前你不需要担心 utf-8 或其他编码。
    • 不,我的意思是当文件在 Windows-1252 中时,我需要使用 utf-8 解码,以便“d�mpe”变成“dümpe”。我怎样才能做到这一点。现在它忽略了 unicode 字符。
    【解决方案2】:

    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 上的系列博文可以提供帮助。

    【讨论】:

      猜你喜欢
      • 2015-09-21
      • 2021-03-22
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多