修复 UnicodeDecodeError

Fix UnicodeDecodeError

我有以下代码。我用 Python 2.7

import csv
import sqlite3

conn = sqlite3.connect('torrents.db')
c = conn.cursor()

# Create table
c.execute('''DROP TABLE torrents''')
c.execute('''CREATE TABLE IF NOT EXISTS torrents
             (name text, size long, info_hash text, downloads_count long, 
             category_id text, seeders long, leechers long)''')

with open('torrents_mini.csv', 'rb') as csvfile:
    spamreader = csv.reader(csvfile, delimiter='|')
    for row in spamreader:
        name = unicode(row[0])
        size = row[1]
        info_hash = unicode(row[2])
        downloads_count = row[3]
        category_id = unicode(row[4])
        seeders = row[5]
        leechers = row[6]
        c.execute('INSERT INTO torrents (name, size, info_hash, downloads_count, 
                   category_id, seeders, leechers) VALUES (?,?,?,?,?,?,?)',
                   (name, size, info_hash, downloads_count, category_id, seeders, leechers))

conn.commit()
conn.close()

我收到的错误信息是

Traceback (most recent call last):
  File "db.py", line 15, in <module>
    name = unicode(row[0])
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 14: ordinal not in range(128)

如果我不转换成 unicode 那么我得到的错误是

sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.

添加 name = row[0].decode('UTF-8') 给我另一个错误

Traceback (most recent call last):
  File "db.py", line 27, in <module>
    for row in spamreader:
_csv.Error: line contains NULL byte

csv文件中包含的数据格式如下

Tha Twilight New Moon DVDrip 2009 XviD-AMiABLE|694554360|2cae2fc76d110f35917d5d069282afd8335bc306|0|movies|0|1                                      

编辑:我终于放弃了尝试,使用 sqlite3 命令行工具完成了任务(这很容易)。 我还不知道是什么导致了错误,但是当 sqlite3 导入所述 csv 文件时,它不断弹出关于 "unescaped character" 的警告,字符是引号 (")。

感谢所有试图提供帮助的人。

您的数据未编码为 ASCII。为您的数据使用正确的编解码器。

您可以告诉 Python 使用什么编解码器:

unicode(row[0], correct_codec)

或使用str.decode()方法:

row[0].decode(correct_codec)

我们无法告诉您正确的编解码器是什么。你必须查阅你从中获得的文件。

如果您无法弄清楚使用了什么编码,您可以使用像 chardet 这样的包来进行有根据的猜测,但要考虑到这样的库不是防错的。