8 октября 2012 г.

Файлы, углубляемся


Файлы
Возможно, вы уже знакомы с понятием файла – так называются именованные области постоянной памяти в вашем компьютере, которыми управляет операционная система.Последний основной встроенный тип объектов, который мы исследуем в нашем обзоре, обеспечивает возможность доступа к этим файлам из программ на языке Python.

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


Операция  -  Интерпретация
output = open(r’C:\spam’, ‘w’)  - Открывает файл для записи (‘w’ означает write – запись)

input = open(‘data’, ‘r’) -  Открывает файл для чтения  (‘r’ означает read – чтение)
input = open(‘data’)  - То же самое, что и в предыдущей строке
                                                         (режим ‘r’ используется по умолчанию)

aString = input.read()  - Чтение файла целиком в единственную строку

aString = input.read(N)  - Чтение следующих N символов (или байтов) в строку
aString = input.readline()  - Чтение следующей текстовой строки
                                                                      (включая символ конца строки) в строку

aList = input.readlines()  - Чтение файла целиком в список строк
                                                                   (включая символ  конца строки)

output.write(aString) - Запись строки символов (или байтов) в файл
output.writelines(aList)  - Запись всех строк из списка в файл
output.close()  - Закрытие файла вручную (выполняется по окончании работы с файлом)
output.flush()  -  Выталкивает выходные буферы на диск, файл остается открытым
anyFile.seek(N)  - Изменяет текущую позицию в файле для
                                          следующей операции, смещая ее на N байтов от начала файла.

for line in open(‘data’):  - Итерации по файлу, построчное чтение
операции над line
open(‘f.txt’,              - Файлы с текстом Юникода в Python 3.0  (строки типа str)
encoding=’latin-1’)

open(‘f.bin’, ‘rb’)  -  Файлы с двоичными данными в Python 3.0

Чтобы открыть файл, программа должна вызвать функцию open, передав ей имя внешнего файла и режим работы. Обычно в качестве режима использует-
ся строка ‘r’, когда файл открывается для чтения (по умолчанию), ‘w’ – когда 
файл открывается для записи или ‘a’ – когда файл открывается на запись в ко-
нец.

Использование файлов
Как только будет получен объект файла, вы можете вызывать его методы для 
выполнения операций чтения или записи. В любом случае содержимое файла 
в программах на языке Python принимает форму строк – операция чтения воз-
вращает текст в строках, и метод записи принимает информацию в виде строк.

Файлы в действии
>>> myfile = open(‘myfile.txt’, ‘w’)  # Открывает файл (создает/очищает)
>>> myfile.write(‘hello text file\n’) # Записывает строку текста
16
>>> myfile.write(‘goodbye text file\n’)
18
>>> myfile.close()       # Выталкивает выходные буферы на диск
 
>>> myfile = open(‘myfile.txt’)       # Открывает файл: ‘r’ – по умолчанию
>>> myfile.readline()                 # Читает строку
‘hello text file\n’
>>> myfile.readline()
‘goodbye text file\n’
>>> myfile.readline()         # Пустая строка: конец файла

Обратите внимание, что в Python 3.0 метод write возвращает количество запи-
санных символов – в версии 2.6 этого не происходит, поэтому в интерактив-
ном сеансе вы не увидите эти числа.

Если необходимо вывести содержимое файла, обеспечив правильную интер-
претацию символов конца строки, его следует прочитать в  строку целиком, 
с помощью метода read, и вывести:

>>> open(‘myfile.txt’).read()  # Прочитать файл целиком в строку
‘hello text file\ngoodbye text file\n’ 
>>> print(open(‘myfile.txt’).read()) # Более дружественная 
                                     форма отображения
hello text file
goodbye text file

А если необходимо просмотреть содержимое файла строку за строкой, лучшим 
выбором будет итератор файла:
>>> for line in open(‘myfile’): # Используйте итераторы, а 
                                не методы чтения
...     print(line, end=’’)
...
hello text file
goodbye text file


В этом случае функцией open создается временный объект файла, содержимое 
которого автоматически будет читаться итератором и возвращаться по одной 
строке в каждой итерации цикла.

Сохранение и интерпретация объектов Python в файлах

Следующий пример записывает различные объекты в текстовый файл.

>>> 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}

Теперь нам необходимо выполнить обратные преобразования, чтобы получить 
из  строк  в  текстовом  файле  действительные  объекты  языка  Python.

>>> F = open(‘datafile.txt’) # Открыть файл снова
>>> line = F.readline()      # Прочитать одну строку
>>> line
‘Spam\n’
>>> line.rstrip()            # Удалить символ конца строки
‘Spam’


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

>>> line = F.readline()        # Следующая строка из файла
>>> line                       # Это - строка
‘43,44,45\n’
>>> parts = line.split(‘,’)    # Разбить на подстроки по запятым
>>> parts
[‘43’, ‘44’, ‘45\n’]

Здесь был использован метод split, чтобы разбить строку на части по запятым, которые играют роль символов-разделителей, – в результате мы получили список строк, каждая из которых содержит отдельное число. Теперь нам необходимо преобразовать эти строки в целые числа, чтобы можно было выполнять математические операции над ними:
>>> int(parts[1])      # Преобразовать строку в целое число
44
>>> numbers = [int(P) for P in parts] # Преобразовать весь список 
>>> numbers
[43, 44, 45]

Как мы уже знаем, функция int преобразует строку цифр в объект целого числа.

Наконец, чтобы преобразовать список и словарь в третьей строке файла, можно воспользоваться встроенной функцией eval, которая интерпретирует строку как программный код на языке 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}]

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





3 комментария:

  1. А как после открытия mp3 файла закрыть его через 5 сек?
    import os
    import time
    s=os.startfile(r'C:\Linkin Park.mp3')
    time.sleep(5)
    s.close() - не работает(((

    ОтветитьУдалить
  2. Отличная статья. Один вопрос. Как реализуется запись из фала в 2-ух мерный массив?

    ОтветитьУдалить