ЛЕКЦИЯ 7
.pdf4.2.Примеры.
Операция чтения двоичных данных из файла возвращает объект типа bytes – последовательность целых чисел, представляющих абсолютные значения байтов (которые могут соответствовать символам, а могут и не соответствовать), который во многих отношениях очень близко напоминает обычную строку:
>>>data = open(‘data.bin’, ‘rb’).read() # Открыть двоичный файл для чтения
>>>data # Строка хранит двоичные данные b’\x00\x00\x00\x07spam\x00\x08’
>>>data[4:8] # Ведет себя как строка
b’spam’
>>> data[4:8][0] # Но в действительности хранит 8-битные целые числа
115
>>> bin(data[4:8][0]) # Функция bin() ‘0b1110011’
4.2.Примеры.
Данные всегда записываются в файл в виде строк, а методы записи не выполняют автоматического форматирования строк:
>>>X, Y, Z = 43, 44, 45 # Объекты языка Python должны
>>>S = ‘Spam’ # записываться в файл только в виде строк
>>>D = {‘a’: 1, ‘b’: 2}
>>>L = [1, 2, 3]
>>>F = open(‘datafile.txt’, ‘w’) # Создает файл для записи
>>>F.write(S + ‘\n’) # Строки завершаются символом \n
>>>F.write(‘%s,%s,%s\n’ % (X, Y, Z)) # Преобразует числа в строки
>>>F.write(str(L) + ‘$’ + str(D)+ ‘\n’) # Преобразует и разделяет символом $
>>>F.close()
Функция автоматического вывода в интерактивной оболочке дает точное побайтовое представление содержимого, а инструкция print интерпретирует встроенные символы конца строки, чтобы обеспечить более удобочитаемое отображение:
>>>chars = open(‘datafile.txt’).read() # Отображение строки
>>>chars # в неформатированном виде
“Spam\n43,44,45\n[1, 2, 3]${‘a’: 1, ‘b’: 2}\n”
>>>print(chars) # Удобочитаемое представление Spam
43,44,45
[1, 2, 3]${‘a’: 1, ‘b’: 2}
4.2.Примеры.
Обратные преобразования для получения из строк в текстовом файле объектов языка Python.
>>>F = open(‘datafile.txt’) # Открыть файл снова
>>>line = F.readline() # Прочитать одну строку
>>>line ‘Spam\n’
>>>line.rstrip() # Удалить символ конца строки ‘Spam’ (можно было line[:-1])
>>>line = F.readline() # Следующая строка из файла
>>>line # Это - строка
‘43,44,45\n’
>>>parts = line.split(‘,’) # Разбить на подстроки по запятым
>>>parts
[‘43’, ‘44’, ‘45\n’]
>>>int(parts[1]) # Преобразовать строку в целое число
44
>>>numbers = [int(P) for P in parts] # Преобразовать весь список
>>>numbers
[43, 44, 45]
4.2.Примеры.
Чтобы преобразовать список и словарь можно воспользоваться встроенной функцией eval, которая интерпретирует строку как программный код на языке Python (формально – строку, содержащую выражение на языке Python):
>>>line = F.readline()
>>>line
“[1, 2, 3]${‘a’: 1, ‘b’: 2}\n”
>>>parts = line.split(‘$’) # Разбить строку по символу $
>>>parts
[‘[1, 2, 3]’, “{‘a’: 1, ‘b’: 2}\n”]
>>>eval(parts[0]) [1, 2, 3]
>>>objects = [eval(P) for P in parts] # То же самое для всех строк в списке
>>>objects
[[1, 2, 3], {‘a’: 1, ‘b’: 2}]
Функция eval представляет собой мощный инструмент. И иногда даже слишком мощный. Она без лишних вопросов выполнит любое выражение на языке Python, даже если в результате будут удалены все файлы в компьютере, если передать в выражение соответствующие права доступа! Если вам действительно необходимо извлекать объекты Python из файлов, но вы не можете доверять источнику этих файлов, идеальным решением будет использование модуля pickle, входящего в состав стандартной библиотеки Python.
4.3.Извлечение объектов из файлов с помощью модуля pickle.
Модуль pickle выполняет сериализацию объектов, – преобразование объектов в строку байтов и обратно.
#Сохранить словарь в файле:
>>>D = {‘a’: 1, ‘b’: 2}
>>>F = open(‘datafile.pkl’, ‘wb’)
>>>import pickle
>>>pickle.dump(D, F) # Модуль pickle запишет в файл любой объект
>>>F.close()
#Прочитать словарь обратно:
>>>F = open(‘datafile.pkl’ 'rb')
>>>E = pickle.load(F) # Загружает любые объекты из файла
>>>E
{‘a’: 1, ‘b’: 2}
4.3.Другие инструменты, напоминающие файлы.
● Стандартные потоки ввода-вывода
Объекты уже открытых файлов в модуле sys, такие как sys.stdout.
● Дескрипторы файлов в модуле os
Целочисленные дескрипторы файлов, обеспечивающие поддержку низкоуровневых операций, таких как блокировка файлов.
● Сокеты, каналы и очереди (FIFO)
Объекты, по своим характеристикам напоминающие файлы, используемые для синхронизации процессов или организации взаимодействий по сети.
●Файлы с доступом по ключу, известные как «хранилища» («shelves») Используются для хранения объектов языка Python по ключу.
●Потоки командной оболочки
Такие инструменты, как os.popen и subprocess. Popen, которые поддерживают возможность запуска дочерних процессов и выполнения операций с их стандартными потоками вводавывода.