Не удается прочитать строки из файла .txt с Python из-за ошибки декодирования - PullRequest
1 голос
/ 20 марта 2020

Я хочу читать в файл .txt построчно, но произошла ошибка: код "gbk" c не может декодировать байт 0x9d в позиции 5195: недопустимая многобайтовая последовательность .

Я не совсем понимаю это. Есть ли несколько способов декодировать файл .txt, и поэтому мне нужно что-то указать? Или я должен как-то конвертировать файл .txt?

import urllib2

fname = urllib2.urlopen("https://www.gutenberg.org/files/1661/1661-0.txt")
for line in fname:
    print(line[0])

Кстати, я попытался загрузить файл .txt и открыть его с локального диска. Та же проблема. Кто-нибудь видел это раньше?

Ответы [ 2 ]

2 голосов
/ 20 марта 2020

используйте это, если вы используете python3:

import urllib2

response = urllib2.urlopen("https://www.gutenberg.org/files/1661/1661-0.txt")

for line in response.decode('utf-8'):
    print(line[0])

или попробуйте запросить пакет

import requests

response = requests.get("https://www.gutenberg.org/files/1661/1661-0.txt").text
1 голос
/ 20 марта 2020

Альтернатива принятому ответу:

Используйте urllib.request для Python 3

Если вы используете Python 3, не используйте urllib2. Вместо этого используйте встроенный модуль urllib.request (не нужно ничего устанавливать).

См. Примечания здесь :

Примечание. Модуль urllib2 разделен на несколько модулей в Python 3 с именами urllib.request и urllib.error. ,

Чтобы прочитать текст книги в переменную:

import urllib.request

book_url = "https://www.gutenberg.org/files/1661/1661-0.txt"

response = urllib.request.urlopen(book_url)
book_text = response.read().decode('utf-8')

Или распечатать всю книгу на терминал:

import urllib.request

book_url = "https://www.gutenberg.org/files/1661/1661-0.txt"

with urllib.request.urlopen(book_url) as f:
    print(f.read().decode('utf-8'))

The requests Пакет

Как отмечается в ответе, вы можете установить и использовать пакет requests для интерфейса HTTP более высокого уровня. Тем не менее, он все еще должен обрабатывать кодировку явно:

import requests

book_url = "https://www.gutenberg.org/files/1661/1661-0.txt"
r = requests.get(book_url)
r.encoding = 'utf-8'
response = r.text
print(response)

Без явной инструкции по использованию UTF-8 результаты могут некорректно обрабатывать определенные символы, такие как так называемые умные / фигурные кавычки Microsoft. Вы можете получить что-то вроде этого ...

Lestrade laughed. âI am afraid that I am still a sceptic,â he said.

... когда вы должны получить это:

Lestrade laughed. “I am afraid that I am still a sceptic,” he said.

Почему требуется явное кодирование?

URL, к которому мы обращаемся, указывает на веб-страницу Project Gutenberg с текстом романа. Однако, когда я открываю эту страницу в своем браузере, данные отображаются неправильно. Например, я вижу это:

Lestrade laughed. “I am afraid that I am still a sceptic,†he said.

В верхней части веб-страницы мы видим следующее:

Title: The Adventures of Sherlock Holmes

Author: Arthur Conan Doyle

Release Date: November 29, 2002 [EBook #1661]
Last Updated: May 20, 2019

Language: English

Character set encoding: UTF-8

Итак, основная часть текста говорит нам, что страница, по-видимому, закодирована с использованием UTF-8.

Однако, если мы проверяем документ (например, с помощью инструментов «проверить элемент» Forefox), мы видим это:

<head>
    <link rel="stylesheet" href="resource://content-accessible/plaintext.css">
</head>

Нет кодировка указано:

<meta charset="UTF-8">

Поэтому мы должны явно обрабатывать это сами, когда обрабатываем текст ответа. Это гарантирует, что Python будет правильно обрабатывать данные.

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

...