Как исправить 'UnicodeDecodeError:'? - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь создать чат-бота, и всякий раз, когда я пытаюсь запустить свой код, я получаю это,

строка 107, в для строки в f: Файл "/Users/usr/anaconda3/lib/python3.6/encodings/ascii.py", строка 26, в декодировании вернуть codecs.ascii_decode (input, self.errors) [0] UnicodeDecodeError: кодек «ascii» не может декодировать байт 0xf8 в позиции 102: порядковый номер не в диапазоне (128)

Я собирался попытаться добавить,

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

Однако мне сказали, что setdefaultencoding небезопасно использовать, поэтому я не удосужился попробовать это.

Ниже мой код,

import sqlite3
import json
from datetime import datetime

timeframe = '2015-01'
sql_transaction = []

connection = sqlite3.connect('/Users/usr/Desktop/fileName/RC_{}'.format(timeframe))
c = connection.cursor()


def create_table():
    c.execute("""CREATE TABLE IF NOT EXISTS parent_reply
    (parent_id TEXT PRIMARY KEY, comment_id TEXT UNIQUE, parent TEXT,
     comment TEXT, subreddit TEXT, unix INT, score INT)""")


def format_data(data):
    data = data.replace("\n", " newlinechar ").replace("\r", " newlinechar ").replace('"', "'")
    return data


def find_existing_score(pid):
    try:
        sql = "SELECT score FROM parent_reply WHERE parent_id = '{}' LIMIT 1".format(pid)
        c.execute(sql)
        result = c.fetchon()
        if result != None:
            return result[0]
        else:
            return False
    except Exception as e:
        # print("find_parent", e)
        return False

if __name__ == "__main__":
    create_table()
    row_counter = 0
    paired_rows = 0


    with open("/Users/usr/Desktop/fileName/RC_{}".format(timeframe), buffering=1000) as f:
        for row in f:
            row_counter += 1
            row = json.loads(row)
            parent_id = row['parent_id']
            body = format_data(row['body'])
            created_utc = row['created_utc']
            score = row['score']
            subreddit = row['subreddit']
            comment_id = row['name']
            parent_data = find_parent(parent_id)

            if score >= 2:
                if acceptable(body):
                    existing_comment_score = find_existing_score(parent_id)
                    if existing_comment_score:
                        if score > existing_comment_score:
                            sql_insert_replace_comment(comment_id, parent_id, parent_data, body, subreddit, created_utc, score)

                    else:
                        if parent_data:
                            sql_insert_has_parent(comment_id, parent_id, parent_data, body, subreddit, created_utc, score)
                            paired_rows += 1
                        else:
                            sql_insert_no_parent(comment_id, parent_id, body, subreddit, created_utc, score)
            if row_counter % 100000 == 0:
                print("Total rows read: {}, Paired rows: {}, Time: {}".format(row_counter, paired_rows, str(datetime.now())))

RC_2015-01 извлекается из zip-файла с именем RC_2015-01.bz2. Я не уверен, что это проблема.

1 Ответ

0 голосов
/ 29 мая 2019

Я решил это!

timeframe = '2015-01'
sql_transaction = []

connection = sqlite3.connect('/Users/usr/Desktop/fileName/RC_{}.db'.format(timeframe))
c = connection.cursor()

Проблема заключалась в том, что она создала базу данных, которая не была бы базой данных и имела бы то же имя, что и файл, который она пыталась декодировать. При добавлении .db файл становится базой данных и получает другое имя.

...