Стоит ли открывать файлы в режиме wb, когда кодировка неизвестна? - PullRequest
0 голосов
/ 22 февраля 2019

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

try:
    with open('GA-image test.png',encoding='utf8') as File:
        FileBytes = File.read(1000000000)
        TypeOfEncoding = 'utf8'
except:
    try:
        with open('GA-image test.png',encoding='Latin-1') as File:
            FileBytes = File.read(1000000000)
            TypeOfEncoding = 'Latin-1'
#To shorten this code I'm just going to give two of the types of encoding

with open('GA-image test2.png','wb') as FileW:
    print(TypeOfEncoding)
    FileBytes2 = str.encode(FileBytes)
    FileBytes3 = FileW.write(FileBytes2)

Это ссылка на этот код и тестовое изображение, которое я использовал: https://cdn.discordapp.com/attachments/496421060565139466/548261637782503425/Reading_and_writing_a_file_useing_file_bytes.zip

1 Ответ

0 голосов
/ 22 февраля 2019

Данные изображения не текст , не открывать изображения в текстовом режиме.Не для чтения и не для записи.

В Python вы открываете файлы в одном из двух режимов: текстовом и двоичном, используя t или b в аргументе mode.Если вы не используете ни один, подразумевается t.

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

Поэтому всегда открывайте их в двоичном режиме, добавляя символ b врежим файла:

with open('GA-image test.png', 'rb') as image_file:
    image_bytes = image_file.read()

with open('GA-image test2.png', 'wb') as output_file:
    output_file.write(image_bytes)

Текстовые кодеки - это только одна форма хранения информации в виде последовательности байтов, форматы изображений, такие как PNG, являются другой и не предназначены для того, чтобы иметь значение в виде текста.То, что вы всегда можете декодировать данные изображения, так как Latin-1 является совпадением , случайностью того, как разработан кодек Latin-1, а не преднамеренным.

В качестве примечания:обычно плохая идея использовать except, так как она перехватывает все исключения, а не только ошибки при открытии файла или ошибки декодирования, которые всегда будут возникать из-за попытки чтения данных PNG как UTF-8.Используйте конкретные исключения, где это возможно.

...