Python ошибки при чтении файла

Исключение UnicodeDecodeError возникает в ситуации невозможности декодирования последовательности байтов в символы Юникода. Python версий 3+ оперирует исключительно со строками в одной из кодировок юникода (подробнее об этом можно почитать здесь). Таким образом, для того чтобы получить возможность работать с текстовыми данными в других кодировках, эти данные неоходимо транслировать в кодировку Юникода. Как следует из текста исключения, произошла ошибка при декодировании. Единственное место в вашем коде, где происходит неявное декодирование — txt.read(). Все это означет то, что при открытии файла txt = open(filename) была указана (опять неявно) неверная кодировка. По умолчанию такая кодировка является платформозависимой (ее можно узнать через import locale; locale.getpreferredencoding(False)). Подробнее о функции open.

В вашем случае следует явно указать кодироку открываемого файла, отличную от 'cp1251' (ваша локальная кодировка):

txt = open(filename, encoding=X)

где X — строка обозначающая кодировку конкретного файла. Попробуйте навскидку 'utf-8', 'latin1'.

Далее, если не получится, попробуйте «замять» ошибки. К списку тестируемых кодировок прибавьте 'cp1251':

txt = open(filename, encoding=X, errors='replace')

или

txt = open(filename, encoding=X, errors='ignore')

Есть также вариант, что необходимый файл просто не поддаётся декодированию. В таком случае у вас все еще есть возможность прочитать «сырые данные»:

txt = open(filename, 'br')

SegunPosad

Здравствуйте. Не могу понять. Простой код :

with open('textfile_2.txt', 'tw', encoding='utf-8') as f1:
    f1.write("Привет русский текст")
    f1.read()

Вылезает ошибка:

Traceback (most recent call last):
  File "Диск:/Lessons/python-projects/book1/files/ИМЯ ФАЙЛА.py", line 69, in <module>
    f1.read()
io.UnsupportedOperation: not readable


  • Вопрос задан

    более двух лет назад

  • 710 просмотров

Установите режим открытия файла на чтение

Пригласить эксперта

Меня несколько смущает, что Вы открываете флаг на запись ‘w’, а потом на нем же пытаетесь что-то прочитать. Тут выходов два — или переоткрывайте файл на чтение-запись, либо откажитесь от одной из операций.

PS: немного подумав, мне пришла в голову идея, что Вы перепечатываете какой-то листинг. И там режим не ‘tw’, а ‘rw’ (t и r — соседние буквы в раскладке). А ‘rw’ — это как раз режим «чтение-запись».

Спасибо. Сам себя замудрил. Все заработало.
with open(‘text_1’, ‘r’, encoding=’utf-8′) as f1:
print(f1.read())
или
f = open(‘text_1′, encoding=’utf-8’)
print(f.read())
f.close()


  • Показать ещё
    Загружается…

04 июн. 2023, в 12:23

30000 руб./за проект

04 июн. 2023, в 12:18

20000 руб./за проект

04 июн. 2023, в 12:07

2000 руб./за проект

Минуточку внимания

In Python 3, IOError is an alias of OSError. To verify, run the code:

IOError is OSError
---
True
  • PEP 3151 — Reworking the OS and IO exception hierarchy

OSError is the parent class of the file I/O exceptions.

  • Exception hierarchy
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
OSError.__subclasses__()
---
[ConnectionError,
 BlockingIOError,
 ChildProcessError,
 FileExistsError,
 FileNotFoundError,
 IsADirectoryError,
 NotADirectoryError,
 InterruptedError,
 PermissionError,
 ProcessLookupError,
 TimeoutError,
 io.UnsupportedOperation,
 signal.ItimerError,
 socket.herror,
 socket.gaierror,
 socket.timeout,
 ssl.SSLError,
 shutil.Error,
 shutil.SpecialFileError,
 shutil.ExecError,
 shutil.ReadError,
 urllib.error.URLError,
 gzip.BadGzipFile]

Hence, catch the OSError and check the exact class if detail is requied.

try:
    with open('hoge') as f:
        pass
except OSError as e:
    print(f"{type(e)}: {e}")
---
<class 'FileNotFoundError'>: [Errno 2] No such file or directory: 'hoge'

Joey Black

27 / 19 / 10

Регистрация: 10.02.2016

Сообщений: 236

1

Ошибка кодировки при чтении из файла

30.03.2017, 14:11. Показов 5269. Ответов 12

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день, коллеги! Читаю локальный файл при помощи urllib

Python
1
2
3
4
5
import urllib
file_address="C:/work/stores/4067.html"
file=urllib.request.urlopen("file:///" + file_address)
soup=BeautifulSoup(file,"lxml")
print(soup.prettify())

При этом весь русский текст превращается в тарабарский. Открываю локальный файл браузером и тоже тарабарский. Если открывать файл блокнотом, то всё нормально. В файле указана кодировка:

HTML5
1
charset=windows-1251

Как добавить кодировку в

Python
1
urllib.request.urlopen()

?



0



103 / 81 / 54

Регистрация: 25.11.2016

Сообщений: 278

30.03.2017, 14:22

2

измени кодировку файла на utf-8



1



27 / 19 / 10

Регистрация: 10.02.2016

Сообщений: 236

30.03.2017, 14:51

 [ТС]

3

Есть очень много файлов и заходить в каждый менят неудобно, можно ли как-то в функции это сделать?

Добавлено через 1 минуту
изменил в одном, всё работает, но всё же не хочется лезть во все файлы



0



Эксперт по компьютерным сетям

5889 / 3347 / 1033

Регистрация: 03.11.2009

Сообщений: 9,974

30.03.2017, 17:05

4

А почему используете urllib, вместо того, чтобы open() Ваш файл?



1



27 / 19 / 10

Регистрация: 10.02.2016

Сообщений: 236

30.03.2017, 17:53

 [ТС]

5

Чтобы запихнуть его в BeautifulSoup, на open() суп ругается



0



pashtet-kun

135 / 120 / 37

Регистрация: 30.09.2012

Сообщений: 400

30.03.2017, 17:58

6

Python
1
BeautifulSoup(open("lalala.html"))

и какую ошибку выдает?



1



27 / 19 / 10

Регистрация: 10.02.2016

Сообщений: 236

31.03.2017, 11:14

 [ТС]

7

Код

UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 774: character maps to <undefined>



0



pashtet-kun

135 / 120 / 37

Регистрация: 30.09.2012

Сообщений: 400

31.03.2017, 11:20

8

Лучший ответ Сообщение было отмечено Joey Black как решение

Решение

попробуй

Python
1
2
3
import codecs
fileObj = codecs.open( "someFilePath", "r", "cp1251" )
soup = BeautifulSoup(fileObj)



1



Joey Black

27 / 19 / 10

Регистрация: 10.02.2016

Сообщений: 236

31.03.2017, 11:34

 [ТС]

9

Python
1
2
3
4
from bs4 import BeautifulSoup
import codecs
file = codecs.open( file_address, "r", "cp1251" )
soup = BeautifulSoup(file,'lxml')

Код

  File "C:Anaconda3libencodingscp1251.py", line 15, in decode
    return codecs.charmap_decode(input,errors,decoding_table)

UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 809: character maps to <undefined>



0



135 / 120 / 37

Регистрация: 30.09.2012

Сообщений: 400

31.03.2017, 11:43

10

значит кодировка файла другая, попробуй utf-8 или файл сюда выложи



1



27 / 19 / 10

Регистрация: 10.02.2016

Сообщений: 236

31.03.2017, 11:47

 [ТС]

11

С utf-8 заработало), спасибо!!!



0



27 / 19 / 10

Регистрация: 10.02.2016

Сообщений: 236

06.04.2017, 15:17

 [ТС]

12

коллеги, сел за другой комп, запустил и теперь вместо русского языка одни знаки вопроса, что делать?



0



27 / 19 / 10

Регистрация: 10.02.2016

Сообщений: 236

06.04.2017, 15:41

 [ТС]

13

Добавлено через 2 минуты
не получается выложить страницу

Добавлено через 18 минут
поменял язык программ не поддерживающих юникод на русский, всё заработало



0



Разрабатывая приложения вам придется работать с файлами, анализировать большие объемы данных, сохранять пользовательские данные, чтобы они не терялись по завершению работы программы. Также при работе с файлами важно научиться обрабатывать ошибки, чтобы они не привели к аварийному завершению программы. Для этого в Python существуют специальные объекты — исключения, которые создаются для управления ошибок.

Содержание страницы:
1. Чтение файла 
    1.2. Чтение больших файлов и работа с ними
    1.3. Анализ текста из файла
2. Запись в файл
    2.1. Запись в пустой файл
    2.2. Многострочная запись в файл
    2.3. Присоединение данных к файлу
3. Исключения
    3.1. Блоки try-except
    3.2. Блоки try-except-else
    3.3. Блоки try-except с текстовыми файлами
    3.4. Ошибки без уведомления пользователя

1. Чтение файла в Python

В файлах может содержаться любой объем данных, начиная от небольшого рассказа и до сохранения истории погоды за столетия. Чтение файлов особенно актуально для приложений, предназначенных для анализа данных. Приведем пример простой программы, которая открывает файл и выводит его содержимое на экран. В примере я буду использовать файл с числом «Пи» с точностью до 10 знаков после запятой. Скачать этот файл можно прямо здесь ( pi_10.txt ) или самим создать текстовый файл и сохранить под любым именем. Пример программы, которая открывает файл и выводит содержимое на экран:

with open(‘pi_10.txt’) as file_pi:
    digits = file_pi.read()
print(digits)

Код начинается с ключевого слова with. При использование ключевого слова with используемый файл открывается с помощью функции open(), а закрывается автоматически после завершения блока with и вам не придется в конце вызывать функцию close(). Файлы можно открывать и закрывать явными вызовами open() и close(). Функция open() получает один аргумент — имя открываемого файла, в нашем случае ‘pi_10.txt’. Python ищет указанный файл в каталоге, где хранится файл текущей программы. Функция open() возвращает объект, представляющий файл ‘pi_10.txt’. Python сохраняет этот объект в переменной file_pi .  

После появления объекта, представляющего файл ‘pi_10.txt’, используется метод read(), который читает все содержимое файла и сохраняет его в одной строке в переменной contents. В конце с помощью функции print содержимое выводится на экран. Запустив этот файл, мы получим данные, находящиеся в нашем файле ‘pi_10.txt’.

3.1415926535

В случае, если файл расположен не в одном каталоге с файлом программы, необходимо указать путь, чтобы Python искал файлы в конкретном месте. Существует два пути как прописать расположение файла:

  •  Относительный путь. 

Относительный путь приказывает Python искать файлы в каталоге, который задается относительно каталога, в котором находится текущий файл программы

with open(‘files/имя_файла.txt’) as file:

  • Абсолютный путь. 

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

file_path = ‘/Users/Desktop/files/имя_файла.txt’
with open(file_path) as file:

С абсолютными путями можно читать файлы из любого каталога вашей системы. 

1.2. Чтение больших файлов на Python и работа с ними

В первом примере был файл с 10 знаками после запятой. Теперь давайте проанализируем файл с миллионом знаков числа «Пи» после запятой. Скачать число «Пи» с миллионом знаков после запятой можно отсюда( ‘pi_1000000.txt’ ). Изменять код из первого примера не придется, просто заменим файл, который должен читать Python. 

Выведем на экран первые 100 знаков после запятой. Добавим в конец функцию len, чтобы узнать длину файла

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

1000002

Из выходных данных видно, что строка содержит значение «Пи» с точностью до 1 000 000 знаков после запятой. В Python нет никаких ограничений на длину данных, с которыми можно работать, единственное ограничение это объем памяти вашей системы. 

После сохранения данных в переменной можно делать с ними все что угодно. Давайте проверим, входит ли в число «Пи» дата вашего дня рождения. Напишем небольшую программу, которая будет читать файл и проверять входит ли дата день рождения в первый миллион числа «Пи»:

with open(‘pi_1000000.txt‘) as file_pi:
    digits = file_pi.read()
birthday = input(«Введите дату дня рождения: «)
if birthday  in digits:
    print(«Ваш день рождение входит в число ‘Пи'»)
else:
    print(«Ваш день рождение не входит в число ‘Пи'»)

Начало программы не изменилось, читаем файл и сохраняем данные в переменной digits. Далее запрашиваем данные от пользователя с помощью функции input и сохраняем в переменную birstday. Затем проверяем вхождение birstday в digits с помощью команды if-else. Запустив несколько раз программу, получим результат:

Введите дату дня рождения: 260786
Ваш день рождение не входит в число ‘Пи’

Введите дату дня рождения: 260884
Ваш день рождение входит в число ‘Пи’

В зависимости от введенных данных мы получили результат вхождения или не вхождения дня рождения в число «Пи»

Важно: Читая данные из текстового файла, Python интерпретирует весь текст как строку. Если вы хотите работать с ним в числовом контексте, то преобразуйте данные в целое число функцией int() или в вещественное число функцией float().

1.3. Анализ текста из файла на Python

Python может анализировать текстовые файлы, содержащие целые книги. Возьмем книгу «Алиса в стране чудес» и попробуем подсчитать количество слов в книге. Текстовый файл с книгой можете скачать здесь(‘ alice ‘) или загрузить любое другое произведение. Напишем простую программу, которая подсчитает количество слов в книге и сколько раз повторяется имя Алиса в книге.

filename = ‘alice.txt’

with open(filename, encoding=’utf-8′) as file:
    contents = file.read()
n_alice = contents.lower().count(‘алиса’)
words = contents.split()
n_words = len(words)

print(f»Книга ‘Алиса в стране чудес’ содержит {n_words} слов.»)
print(f»Имя Алиса повторяется {n_alice} раз.»)

При открытии файла добавился аргумент encoding=’utf-8′. Он необходим, когда кодировка вашей системы не совпадает с кодировкой читаемого файла. После чтения файла, сохраним его в переменной contents.

Для подсчета вхождения слова или выражений в строке можно воспользоваться методом count(), но прежде привести все слова к нижнему регистру функцией lower(). Количество вхождений сохраним в переменной n_alice

Чтобы подсчитать количество слов в тексе, воспользуемся методом split(), предназначенный для построения списка слов на основе строки. Метод split() разделяет строку на части, где обнаружит пробел и сохраняет все части строки в элементах списка. Пример метода split():

title = ‘Алиса в стране чудес’
print(title.split())

[‘Алиса’, ‘в’, ‘стране’, ‘чудес’]

После использования метода split(), сохраним список в переменной words и далее подсчитаем количество слов в списке, с помощью функции len(). После подсчета всех данных, выведем на экран результат:

Книга ‘Алиса в стране чудес’ содержит 28389 слов.
Имя Алиса повторяется 419 раз.

2.1. Запись в пустой файл в Python

Самый простой способ сохранения данных, это записать их в файл. Чтобы записать текс в файл, требуется вызвать open() со вторым аргументом, который сообщит Python что требуется записать файл. Пример программы записи простого сообщения в файл на Python:

filename = ‘memory.txt’

with open(filename, ‘w’) as file:
    file.write(«Язык программирования Python»)

Для начала определим название и тип будущего файла и сохраним в переменную filename. Затем при вызове функции open() передадим два аргумента. Первый аргумент содержит имя открываемого файла. Второй аргумент ‘ w ‘ сообщает Python, что файл должен быть открыт в режиме записи. Во второй строчке метод write() используется для записи строки в файл. Открыв файл ‘ memory.txt ‘ вы увидите в нем строку:

Язык программирования Python

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

Важно: Открывая файл в режиме записи ‘ w ‘, если файл уже существует, то Python уничтожит его данные перед возвращением объекта файла.

Файлы можно открывать в режимах:

  • чтение ‘ r ‘
  • запись ‘ w ‘
  • присоединение ‘ a ‘
  • режим как чтения, так и записи ‘ r+ ‘

2.2. Многострочная запись в файл на Python

При использовании функции write() символы новой строки не добавляются в записываемый файл:

filename = ‘memory.txt’

with open(filename, ‘w’) as file:
    file.write(«Язык программирования Python»)
    file.write(«Язык программирования Java»)
    file.write(«Язык программирования Perl»)

В результате открыв файл мы увидим что все строки склеились:

Язык программирования PythonЯзык программирования JavaЯзык программирования Perl

Для написания каждого сообщения с новой строки используйте символ новой строки n

filename = ‘memory.txt’

with open(filename, ‘w’) as file:
    file.write(«Язык программирования Pythonn«)
    file.write(«Язык программирования Javan«)
    file.write(«Язык программирования Perln«)

Результат будет выглядеть так:

Язык программирования Python
Язык программирования Java
Язык программирования Perl

2.3. Присоединение данных к файлу на Python 

Для добавления новых данных в файл, вместо того чтобы постоянно перезаписывать файл, откройте файл в режиме присоединения ‘ a ‘. Все новые строки добавятся в конец файла. Возьмем созданный файл из раздела 2.2 ‘memory.txt’. Добавим в него еще пару строк.

filename = ‘memory.txt’

with open(filename, ‘a’) as file:
    file.write(«Hello worldn»)
    file.write(«Полет на лунуn»)

В результате к нашему файлу добавятся две строки:

Язык программирования Python
Язык программирования Java
Язык программирования Perl
Hello world
Полет на луну

3. Исключения в Python

При выполнении программ могут возникать ошибки, для управления ими Python использует специальные объекты, называемые исключениями. Когда в программу включен код обработки исключения, ваша программа продолжится, а если нет, то программа остановится и выведет трассировку с отчетом об исключении. Исключения обрабатываются в блоках try-except. С блоками try-except программы будут работать даже в том случае, если что-то пошло не так.

3.1. Блоки try-except на Python

Приведем пример простой ошибки деления на ноль:

print(7/0)

Traceback (most recent call last):
  File «example.py», line 1, in <module>
    print(7/0)
ZeroDivisionError: division by zero

Если в вашей программе возможно появление ошибки, то вы можете заранее написать блок try-except для обработки данного исключения. Приведем пример обработки ошибки ZeroDivisionError с помощью блока try-except:

try:
    print(7/0)
except ZeroDivisionError:
    print(«Деление на ноль запрещено»)

Команда print(7/0) помещена в блок try. Если код в блоке try выполняется успешно, то Python пропускает блок except.  Если же код в блоке try создал ошибку, то Python ищет блок except и запускает код в этом блоке. В нашем случае в блоке except выводится сообщение «Деление на ноль запрещено». При выполнение этого кода пользователь увидит понятное сообщение:

Деление на ноль запрещено

Если за кодом try-except следует другой код, то Python продолжит выполнение программы. 

3.2. Блок try-except-else на Python

Напишем простой калькулятор, который запрашивает данные у пользователя, а затем результат деления выводит на экран. Сразу заключим возможную ошибку деления на ноль  ZeroDivisionError и добавим блок else при успешном выполнение блока try.

while True:
    first_number = input(«Введите первое число: «)
    if first_number == ‘q’:
        break
    second_number = input(«Введите второе число: «)
    if second_number == ‘q’:
        break
    try:
        a = int(first_number) / int(second_number)
    except ZeroDivisionError:
        print(«Деление на ноль запрещено»)
    else:
        print(f»Частное двух чисел равно {a}»)

Программа запрашивает у пользователя первое число (first_number), затем второе (second_number). Если пользователь не ввел » q « для завершения работы программа продолжается. В блок try помещаем код, в котором возможно появление ошибки. В случае отсутствия ошибки деления, выполняется код else и Python выводит результат на экран. В случае ошибки ZeroDivisionError выполняется блок except и выводится сообщение о запрете деления на ноль, а программа продолжит свое выполнение. Запустив код получим такие результаты:

Введите первое число: 30
Введите второе число: 5
Частное двух чисел равно 6.0
Введите первое число: 7
Введите второе число: 0
Деление на ноль запрещено
Введите первое число:  q

В результате действие программы при появлении ошибки не прервалось.

3.3. Блок  try-except с текстовыми файлами на Python

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

filename = ‘alice_2.txt’

with open(filename, encoding=’utf-8′) as file:
    contents = file.read()

Так как такого файла не существует, Python выдает исключение:

Traceback (most recent call last):
  File «example.py», line 3, in <module>
    with open(filename, encoding=’utf-8′) as file:
FileNotFoundError: [Errno 2] No such file or directory: ‘alice_2.txt’

FileNotFoundError — это ошибка отсутствия запрашиваемого файла. С помощью блока try-except обработаем ее:

filename = ‘alice_2.txt’

try:
    with open(filename, encoding=’utf-8′) as file:
        contents = file.read()
except FileNotFoundError:
    print(f»Запрашиваемый файл {filename } не найден»)

В результате при отсутствии файла мы получим:

Запрашиваемый файл alice_2.txt не найден

3.4. Ошибки без уведомления пользователя

В предыдущих примерах мы сообщали пользователю об ошибках. В Python есть возможность обработать ошибку и не сообщать пользователю о ней и продолжить выполнение программы дальше. Для этого блок try пишется, как и обычно, а в блоке except вы прописываете Python не предпринимать никаких действий с помощью команды pass. Приведем пример ошибки без уведомления:

ilename = ‘alice_2.txt’

try:
    with open(filename, encoding=’utf-8′) as file:
        contents = file.read()
except FileNotFoundError:
    pass

В результате при запуске этой программы и отсутствия запрашиваемого файла ничего не произойдет.

Далее: Функции json. Сохранение данных Python

Назад: Классы в Python

Понравилась статья? Поделить с друзьями:
  • Python ошибки socket
  • Python ошибка синтаксиса
  • Python tkinter окно ошибки
  • Python split ошибка
  • Python return ошибка