Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Васильев Ю. - Python для data science (Библиотека программиста) - 2023.pdf
Скачиваний:
7
Добавлен:
07.04.2024
Размер:
7.21 Mб
Скачать

94      Глава 4. Доступ к данным из файлов и API

Двоичные файлы

Текстовые файлы — не единственный тип файлов, с которыми вам придется работать. Существуют также исполняемые (.exe) и графические (.jpeg, .bmp и др.) файлы, которые содержат данные в двоичном формате в виде последовательности байтов. Поскольку эти байты обычно интерпретируются не как текстовые символы, вы не можете получить доступ к содержимому двоичного файла, открыв его в текстовом режиме. Вместо этого необходимо использовать функцию open() в двоичном режиме.

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

image = "/path/to/file.jpg"

with open(image, "rb") as image_file: content = image_file.read()

print(len(content))

Мы сообщаем функции open(), что нужно открыть файл для чтения в двоичном режиме, передавая "rb" в качестве второго параметра . Извлеченный объект, как и объект, полученный при открытии файла в текстовом режиме, содержит метод read(), который позволяет получить содержимое файла . В данном примере содержимое извлекается в виде объекта bytes. И мы просто определяем количество байтов, прочитанных из файла .

Экспортирование данных в файл

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

Вы можете записать данные, создав новый файл из Python-скрипта или перезаписав существующий. Рассмотрим второй вариант. Возвращаясь к примеру из раздела «Файлы с табличными данными», предположим, что требуется изменить строку в файле cars.csv, скорректировав цену определенного автомобиля. Напомним, что данные были считаны из файла cars.csv в список словарей с именем cars. Чтобы просмотреть значения каждого словаря в этом списке, можно запустить следующий цикл:

Экспортирование данных в файл      95

for row in cars: print(list(row.values()))

В теле цикла мы вызываем метод values() для каждого словаря списка, тем самым преобразуя значения словаря в объект dict_values, который легко преобразовать в список. Каждый список представляет собой строку из исходного файла CSV, как показано здесь:

['1997', 'Ford', 'E350', '3200.00']

['1999', 'Chevy', 'Venture', '4800.00']

['1996', 'Jeep', 'Grand Cherokee', '4900.00']

Предположим, нам нужно обновить поле Price во второй строке (для автомобиля Chevy Venture) и сохранить это изменение в исходном файле cars.csv. Это можно сделать так:

to_update = ['1999', 'Chevy', 'Venture']new_price = '4500.00'

with open('path/to/cars.csv', 'w') as csvfile:fieldnames = cars[0].keys()

writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader()

for row in cars:

if set(to_update).issubset(set(row.values())): row['Price'] = new_price

writer.writerow(row)

Прежде всего, нам нужен способ идентифицировать строку, которую требуется обновить. Мы создаем список с названием to_update, элементов в котором будет достаточно для того, чтобы однозначно идентифицировать строку . Затем определяем новое значение для изменяемого поля как new_price . Далее открываем файл для записи, передавая параметр w в функцию open() . Используемый здесь режим w будет перезаписывать существующее содержимое файла. Соответственно, далее нужно определить имена полей, которые будут отправлены в файл . Это имена ключей словаря, который представляет собой строку с информацией об автомобиле.

Используя функцию csv.DictWriter(), мы создаем объект writer, который будет преобразовывать словари из списка cars в выходные строки для отправки в файл cars.csv. Проходя в цикле по словарям списка cars , проверяем, соответствует ли каждая строка указанному идентификатору. Если да, то для данной строки обновляем поле Price. Наконец, все еще внутри цикла, записываем каждую строку в файл, используя метод writer.writerow().