Как ставить бинарный файл на дозапись питон
Бинарные файлы в отличие от текстовых хранят информацию в виде набора байт. Для работы с ними в Python необходим встроенный модуль pickle . Этот модуль предоставляет два метода:
- dump(obj, file) : записывает объект obj в бинарный файл file
- load(file) : считывает данные из бинарного файла в объект
При открытии бинарного файла на чтение или запись также надо учитывать, что нам нужно применять режим «b» в дополнение к режиму записи («w») или чтения («r»). Допустим, надо надо сохранить два объекта:
import pickle FILENAME = "user.dat" name = "Tom" age = 19 with open(FILENAME, "wb") as file: pickle.dump(name, file) pickle.dump(age, file) with open(FILENAME, "rb") as file: name = pickle.load(file) age = pickle.load(file) print("Имя:", name, "\tВозраст:", age)
С помощью функции dump последовательно записываются два объекта. Поэтому при чтении файла также последовательно посредством функции load мы можем считать эти объекты. Консольный вывод программы:
Имя: Tom Возраст: 28
Подобным образом мы можем сохранять и извлекать из файла наборы объектов:
import pickle FILENAME = "users.dat" users = [ ["Tom", 28, True], ["Alice", 23, False], ["Bob", 34, False] ] with open(FILENAME, "wb") as file: pickle.dump(users, file) with open(FILENAME, "rb") as file: users_from_file = pickle.load(file) for user in users_from_file: print("Имя:", user[0], "\tВозраст:", user[1], "\tЖенат(замужем):", user[2])
В зависимости от того, какой объект мы записывали функцией dump, тот же объект будет возвращен функцией load при считывании файла.
Имя: Tom Возраст: 28 Женат(замужем): True Имя: Alice Возраст: 23 Женат(замужем): False Имя: Bob Возраст: 34 Женат(замужем): False
Чтение бинарных файлов с помощью Python
Файл, содержащий бинарные данные, называется двоичным (бинарным) файлом. Любые форматированные и неформатированные бинарные данные хранятся в бинарных файлах, нечитабельных для человека и использующихся компьютером напрямую.
Когда бинарный файл требуется просмотреть или переместить, содержимое файла переводится в формат, понятный человеку. Бинарный файл имеет расширение .bin. Прочитать его можно с помощью встроенной функции или модуля. В этом уроке мы разберём различные способы чтения бинарных файлов с помощью Python.
Подготовка
Перед тем, как начать урок, желательно создать один или несколько бинарных файлов, чтобы воспользоваться скриптом из примера. Ниже представлены два скрипта на Python, которые создадут два бинарника. Файл binary1.py создаёт string.bin, содержащий строковые данные, а binary2.py – number_list.bin со списком из числовых данных.
Binary1.py
# Создаём бинарный файл file_handler = open("string.bin", "wb") # Добавляем две строки в бинарный файл file_handler.write(b"Welcome to LinuxHint.\nLearn Python Programming.") # Закрываем чтение file_handler.close()
Binary2.py
# Создаём бинарный файл file=open("number_list.bin","wb") # Объявляем список с числовыми данными numbers=[10,30,45,60,70,85,99] # Конвертируем список в массив barray=bytearray(numbers) # Записываем массив в файл file.write(barray) file.close()
Считываем бинарный файл со строковыми данными в массив байтов
В Python существует множество способов прочитать бинарный файл. Можно прочитать определённое количество байтов или весь файл сразу.
В приведенном ниже коде функция open() открывает для чтения string.bin, а функция read() на каждой итерации цикла while считывает по 7 символов в файле и выводит их. Далее мы используем функцию read() еще раз, но уже без аргументов — для считывания всего файла. После считывания содержимое выводится на экран.
# Открываем бинарный файл на чтение file_handler = open("string.bin", "rb") # Читаем первые 7 байтов из файла data_byte = file_handler.read(7) print("Print three characters in each iteration:") # Проходим по циклу, чтобы считать оставшуюся часть файла while data_byte: print(data_byte) data_byte = file_handler.read(7) # Записываем всё содержимое файла в байтовую строку with open('string.bin', 'rb') as fh: content = fh.read() print("Print the full content of the binary file:") print(content)
Результат
После выполнения скрипта мы получим следующий результат.
Считываем бинарный файл со строковыми данными в массив
Следующий скрипт поможет нам прочитать бинарник number_list.bin, созданный нами ранее.
# Открываем на чтение бинарный файл file = open("number_list.bin", "rb") # Считываем в список первые 5 элементов number = list(file.read(5)) # Выводим список print(number) # Закрываем файл file.close()
Бинарный файл содержит список с числовыми данными. Как и в предыдущем примере, функция open() открывает файл и читает из него данные. Затем из бинарника читаются первые 5 чисел и перед выводом объединяются в список.
Результат
После выполнения скрипта мы получим следующий результат. Бинарный файл содержит 7 чисел, первые 5 вывелись на консоль.
Читаем бинарный файл с помощью NumPy
В этой части мы поговорим о том, как создать бинарный файл и прочитать его с помощью массивов NumPy. Перед началом работы необходимо установить модуль NumPy командой в терминале или через ваш редактор Python, в котором вы будете писать программу.
Функция tofile() создаёт текстовый или бинарный файл, а fromfile() считывает данные из файла и создаёт массив.
Синтаксис tofile()
ndarray.tofile(file, sep='', format='%s')
Первый аргумент обязательный – он принимает имя файла, путь или строку. Файл создастся, только если будет указан первый аргумент. Второй аргумент – необязательный, он используется для разделения элементов массива. Третий аргумент также необязателен, он отвечает за форматированный вывод содержимого файла.
Синтаксис fromfile()
numpy.fromfile(file, dtype=float, count=- 1, sep='', offset=0, *, like=None)
Первый аргумент обязательный – он принимает имя файла, путь или строку. Содержимое файла будет прочитано, только если вы укажете имя файла. dtype определяет тип данных в возвращаемом массиве. Count задаёт число элементов массива. Sep – для разделения элементов текста или массива. Offset определяет позицию в файле, с которой начинается считывание. Последний аргумент нужен, чтобы создать массив, не являющийся массивом NumPy.
Напишем следующий код, чтобы создать бинарный файл с помощью массива NumPy, прочитать его и вывести содержимое.
# Импортируем NumPy import numpy as np # Объявляем массив numpy nparray = np.array([34, 89, 30, 45, 90, 11]) # Создаём бинарный файл из numpy-массива nparray.tofile("list.bin") # Выведем данные из бинарного файла print(np.fromfile("list.bin", dtype=np.int64))
Результат
После выполнения скрипта мы увидим следующий результат.
Заключение
Мы рассмотрели 3 разных способа чтения бинарных файлов. В первом примере мы получили содержимое файла в виде массива байтов, во втором и третьем – в виде списка.
Создание и запись в бинарный файл
Добрый вечер. У меня есть строка произвольной длины, длина кратна 16, состоящая из нулей и единиц. Мне необходимо записать её в бинарный файл, который необходимо пере этим создать. Делаю я это вот так:
1 2 3 4
file = open('file.bin','wb') d = pack(str(len(code))+'s', bytes(code, 'UTF-8')) file.write(d)
Но редактор HexEditorNeo считает что каждый символ записан в HEX, а другой редактор не может мои двоичные данные перевести в шестнадцатиречные. Ну и итоговый файл весит [длина строки] байт. Я всегда думал что он должен весить [длина строки] бит. Что я делаю не так? И как делать так? Версия Питона 3.4
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Бинарный файл: создание, чтение, запись
Cоздать бинарный файл, записать в него некоторую информацию, закрыть. Прочитать данные из.
Запись в бинарный файл
почему в бинарный файл записывает просто последнее число а не эту последовательность вот.
Запись в бинарный файл
Всем привет. Подскажите пожалста как через fstream добавить запись в бинарный файл ? нужно.
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
Сообщение от Акыл
Я всегда думал что он должен весить [длина строки] бит
len тебе считает не количество бит, а количество символов в строке.
Регистрация: 22.03.2012
Сообщений: 128
Я знаю это. Я веду к тому что 0 или 1 информации на 1 бит, строка состоит из нулей и единиц => вес файла должен быть равен длине строки в битах. Но вопрос не в этои
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
Сообщение от Акыл
Ну и итоговый файл весит [длина строки] байт. Я всегда думал что он должен весить [длина строки] бит.
Вот если честно, я не совсем понимаю в чем собственно загвоздка. Вот на пример я создаю файл и записываю туда данные:
1 2 3
f = open('test.bin', 'wb') f.write(bytes('привет', 'utf8')) f.close()
Файл весит 12 байт (строка из 6 букв, на кодировку одной буквы выделяется 2 байта) и тут все ясно и понятно. В чем твоя загвоздка?
Регистрация: 22.03.2012
Сообщений: 128
А теперь откройте его HEX редактором ваши буквы воспринимаются как обычный текст. Какая может быть кодировка бинарной строки? Из 0 и 1 вы получаете что каждый символ весил больше одного бита? Итоговый файл после этого метода весит гораздо больше.
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
Сообщение от Акыл
Какая может быть кодировка бинарной строки?
Регистрация: 22.03.2012
Сообщений: 128
Я вас понял, вы хотите сказать что 1 символ может весить минимум 1 байт?
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
Именно. Есть однобайтовые (ascii, cp1251 и т д), двубайтовые, с динамическим размером (это utf8, там символы из таблицы ascii кодируются одним байтом, кириллица и ещё наборы символов двумя и т д).
В общем прочитай про то, что такое кодировки и в чем их смысл.
Регистрация: 22.03.2012
Сообщений: 128
а вот про вывод в питоне /x00 /x01 символов для чего нудны и что значат?
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
Акыл, Ну это просто объяснить на примере однобайтовой кодировки, на пример cp1251.
>>> print(bytes('привет', 'cp1251')) b'\xef\xf0\xe8\xe2\xe5\xf2'
каждый из этих наборов символов, это шестнадцатеричные цифры (x указывает на систему счисления, а ef это само число). Эти цифры указывают на символы в кодировочной таблице (в данном случае в cp1251), по этому можешь открыть таблицу и увидеть, что коду xef (в десятичном представлении ef это число 239) соответствует как раз наша буква п.
Кодовая таблица
Таким образом можешь в ручную получить из этой строки байтов изначальную строку)
Регистрация: 22.03.2012
Сообщений: 128
Все не правильно. Я записываю строку 00010110110000000001001011000001001100000001001000100010000000000001011111000011 0100001100010001
а получаю, на каждый символ 8 символов при открытии hex редактором, мне так не надо
00110000 00110000 00110000 00110001 00110000 00110001 00110001 00110000 00110001 00110001 00110000 00110000 00110000 00110000 00110000 00110000
00110000 00110000 00110000 00110001 00110000 00110000 00110001 00110000 00110001 00110001 00110000 00110000 00110000 00110000 00110000 00110001
00110000 00110000 00110001 00110001 00110000 00110000 00110000 00110000 00110000 00110000 00110000 00110001 00110000 00110000 00110001 00110000
00110000 00110000 00110001 00110000 00110000 00110000 00110001 00110000 00110000 00110000 00110000 00110000 00110000 00110000 00110000 00110000
00110000 00110000 00110000 00110001 00110000 00110001 00110001 00110001 00110001 00110001 00110000 00110000 00110000 00110000 00110001 00110001
00110000 00110001 00110000 00110000 00110000 00110000 00110001 00110001 00110000 00110000 00110000 00110001 00110000 00110000 00110000 00110001
Необходимо, что бы при открытии файла редактором отображалось все правильно. Если смотреть «правильные» файлы через блокнот, то в них белеберда
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
Сообщение от Акыл
Если смотреть «правильные» файлы через блокнот, то в них белеберда
Не знаю, что ты там создавал и как, но если делать все правильно, то все норм.
Сообщение от Акыл
при открытии hex редактором
hex редактором надо пользоваться если знаешь, как все устроенно изнутри и умеешь им пользоваться. Ты же показываешь очень низкий уровень компьютерной грамотности и делаешь похоже какую-то ерунду, но все равно упрямо топаешь ножкой и с криками «Я это не понимаю! Все вокруг плохие, ничего не работает!».
Я тебе уже большую часть всего постарался объяснить, вижу ты не понимаешь. По этому не знаю, что тебе объяснять дальше.
Работа с файлами
Любая программа, которая выполняется на компьютере пользователя скорее всего взаимодействует с файловой системой: умеет открывать файлы, сохранять их в своих форматах, возможно, хранит в файлах настройки.
Сегодня наши программы тоже смогут так делать!
Что такое файл?
До этого момента вся информация, с которой мы работали, хранилась исключительно в оперативной памяти — в переменных.
Но информация из оперативной пропадает при закрытии программы или перезагрузке компьютера. Что делать с данными, которые нужно хранить между запусками? Единственное решение — это хранить данные на энергонезависимом носителе — жестком диске (HDD) или твердотельном накопителе (SSD). Далее будет использоваться термин жесткий диск, хотя подразумевается любое из этих устройств.
Участок жесткого диска, у которого есть имя называется файлом.
Также, как и переменные, файлы занимают какое-то место, их размер измеряется в байтах.
Способ организации и хранения файлов на диске называется файловой системой.
Текстовые и бинарные файлы
С точки зрения прикладных программ файлы делятся на два основных типа: текстовые и бинарные. Физически оба типа файлов не отличаются и хранят в себе байты с данными, отличается лишь их интерпретация нашей программой.
В текстовых файлах хранятся текстовые данные. В зависимости от кодировки каждый символ кодируется равным числом байт.
Текстовые файлы могут иметь произвольные расширения, вам, возможно встречались .txt, .py, .html.
Текстовые файлы можно открыть в текстовом редакторе, например, в блокноте.
В бинарных файлах хранятся произвольные данные: символы, числа, дроби, но разные объекты могут кодироваться разным числом байт.
Как интерпретировать ту или иную группу байт в файле, нам говорит формат файла. Примеры бинарных файлов: .exe, .doc, .dll и тд..
Если открыть бинарный файл в блокноте, вы увидите много страшных символов — компьютер попытается интерпретировать все данные в файле как буквы.
Создаем текстовый файл
При работе с файлами всегда используется следующий алгоритм:
- открытие файла
- изменение или чтение файла
- закрытие файла
Не забудьте закрыть файл, если он вам больше не нужен, иначе другие программы не смогут открыть его. Операционная система следит за тем, чтобы файлом в один момент управляла только одна программа.
Чтобы открыть файл, в питоне используется функция open(path, mode) , которая принимает путь к файлу (абсолютный или относительный) и режим. Режим — это либо чтение (read), либо запись (write), либо добавление в конец файла (append).
Если файл открыт только для чтения, то записать данные в него нельзя. Нужно закрыть его и открыть в другом режиме.
Давайте создадим текстовый файл и запишем туда небольшой текст:
file = open('new.txt', 'w') # открываем файл new.txt для записи (w) file.write("hello world! :)") # записываем строку в файл file.close() # закрываем файл
Обратите внимание: если открыть файл для записи, старые данные из него автоматически стираются.
После выполнения программы, в папке с кодом должен появиться новый файл new.txt, а в нем — строка «hello world».
Читаем текстовый файл
Аналогично записи в текстовый файл, мы можем открыть его для чтения и прочитать все его содержимое в переменную.
file = open('smiles.txt', 'r') # открываем файл smiles.txt для чтения (r) text = file.read() # считываем все содержимое файла в переменную file.close() print(text[:100])
Файл smiles.txt можно скачать тут.
Используем with
Чтобы случайно не забыть закрыть файл после окончания работы с ним, используйте обертку with . Она автоматически закроет файл, как только закончится ее область видимости.
Пример:
with open('smiles.txt', 'r') as file: text = file.read() # файл автоматически закрылся print(text[:100])