Programming: Python:


Форматированный ввод/вывод



  Автор: Корольков Дмитрий
  Источники:

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

Форматированный ввод/вывод – это совокупность операций, обеспечивающая ввод/вывод высокого уровня переменных с применением определённого формата ввода/вывода.

В Питоне имеется несколько способов форматированного ввода/вывода. Самый простой из них – оператор print, печатающий переменные и строковые константы, применяя формат по умолчанию. Другой простой способ вывода данных на дисплей – функция str(), которая выводит любую переменную, используя также формат по умолчанию. Есть также функция repr(), которая выводит данные в машинном(неформатированном) виде. Некоторые типы переменных, которые не могут должным образом отформатироваться функцией str(), обрабатываются схоже с repr(). Пример использования функций str() и repr():

>>> s = 'Hello, world.'

>>> str(s)

'Hello, world.'

>>> `s`#Такое выражение значит то же, что и repr(s)

"'Hello, world.'"#Машинный формат

>>> str(0.1)#Переменная с точкой

'0.1'

>>> `0.1`# repr(0.1)

'0.10000000000000001'#Ошибка округления чисел с точкой

>>> x = 10 * 3.25

>>> y = 200 * 200

>>> s = 'Значение x равно' + `x` + ', а y равен ' + `y` + '...'#Использование операций склеивания

 

... #строк для форматирования

>>> print s

Значение x равно 32.5, а y равен 40000...

>>> #Заключение переменных в кавычки работает для всех типов данных

... p = [x, y]

>>> ps = repr(p)

>>> ps

'[32.5, 40000]'

>>> # Окружение строки дополнительными кавычками

... hello = 'hello, world\n'

>>> hellos = `hello`

>>> print hellos

'hello, world\n'

>>> # Можно заключать в кавычки и константные списки

... `x, y, ('Linux', 'BSD')`

"(32.5, 40000, ('Linux', 'BSD'))"

Для форматированного вывода удобно использовать выравнивание по краю. Для этой цели в Питоне предусмотрены следующие функции модуля string: string.rjust(), string.ljust() и string.center(). Эти функции возвращают выровненную строку по правому и левому краю, а также по центру до определённого количества символов. Они принимают два параметра: саму строку и количество символов, зарезервированных под строку(если строка длинее, то она выводится как есть, а для удаления лишних символов воспользуйтесь “string.ljust(x, n)[0:n]#”). На примере это выглядит так:

>>> import string

>>> for x in range(1, 11):

...     print string.rjust(`x`, 2), string.rjust(`x*x`, 3),

...     # В предыдущем операторе print была поставлена в конце запятая, перевода строки нет:

...     print string.rjust(`x*x*x`, 4)

...

1   1    1

2   4    8

3   9   27

4  16   64

5  25  125

6  36  216

7  49  343

8  64  512

9  81  729

10 100 1000

Для этой же цели можно использовать оператор print со строкой формата, аналогичной Си:

>>> for x in range(1,11):

...     print '%2d %3d %4d' % (x, x*x, x*x*x)# %d означает целое число

...

 

1  1    1

2   4    8

3   9   27

4  16   64

5  25  125

6  36  216

7  49  343

8  64  512

9  81  729

10 100 1000

Очевидно, что число после символа процента определяет количество символов для выравнивания. Спецификатор после процента обозначает тип числа:

%d

Целое число

%f

Число с точкой

%s

Строка

%c

Символ

%e

Число в научном формате

Функция string.zfill() возвращает строку, дополненную нулями слева, если её длина меньше заданной. string.zfill(строка, заданная_ширина):

>>> import string

>>> string.zfill('12', 5)

'00012'

>>> string.zfill('-3.14', 7)

'-003.14'

>>> string.zfill('3.14159265359', 5)

'3.14159265359'

Если использовать оператор print, то можно для той же цели использовать конструкцию “%ширина_поляисло_знаков_после_запятой”:

>>> import math

>>> print 'Значение числа Пи приблизительно  %5.3f.' % math.pi

Значение числа Пи приблизительно 3.142.

Форматировать можно не только строки, но и другие объекты, например, списки, константные списки, заметьте, что в качестве спецификаций форматирования необходимо использовать только константные списки:

>>> table = {'Иван': 4127, 'Жека': 4098, 'Илья': 7678}

>>> for name, phone in table.items():

...     print '%-10s ==> %10d' % (name, phone)

...

 

Иван      ==>       4098

Жека      ==>       7678

Илья       ==>       4127

Для оператора print можно передавать аргументы не по порядку в строке формата, а по именам переменных, описанных в строке формата следующим образом “%(имя_переменнойип_переменной”:

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}

>>> print 'Jack: %(Jack)d; Sjoerd: %(Sjoerd)d; Dcab: %(Dcab)d' % table

Jack: 4098; Sjoerd: 4127; Dcab: 8637678

Операции с файлами.

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

  • Метод open(имя, режим). Открывает файловый объект для последующего оперирования с ним. Функция принимает два параметра: строку, содержащую путь к файлу(может быть абсолютным или относительным текущего каталога или переменной окружения PATH) и режимом открытия файла. Режим открытия файла определяет допустимые операции доступа к файлу:

w

Открыть файл для записи. Если такой файл уже существует, то его содержимое исчезает(если это возможно).

r

Открыть файл только для чтения.

a

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

r+

Открыть файл для записи/чтения, содержимое файла сохраняется.

w+

Открыть файл для записи/чтения, содержимое файла исчезает(см w).

r+b

Открыть двоичный (если такие файлы поддерживаются операционной системой) файл для записи/чтения, содержимое файла сохраняется.

w+b

Открыть двоичный файл для записи/чтения, содержимое файла исчезает(см w).

rb

Открыть двоичный файл только для чтения.

wb

Открыть двоичный файл для записи. Если такой файл уже существует, то его содержимое исчезает(если это возможно).

Двоичные файлы обеспечивают более быстрый доступ к данным, но бывают не переносимы и, к тому же, их сложно редактировать и просматривать. Текстовые файлы применимы в большинстве случаев, так как они переносимы, легко просматриваются и редактируются, но они медленнее двоичных и могут отображать корректно только символы набора ASCII.

>>> f=open('/tmp/workfile', 'w')

>>> print f

<open file '/tmp/workfile', mode 'w' at 80a0960>

  • Метод read([число_байт]). Данный метод читает из файла, открытого для чтения число байтов, указанных в качестве аргумента. Если метод вызывается без параметров, то читается весь файл, если файл был прочитан до конца(встретился символ EOF), то метод read() возвращает пустую строку:

·                >>> f.read()

·                'This is the entire file.\n'

·                >>> f.read()

·                ''

  • Метод readline() читает одну строку файла до символа перевода строки(включая сам символ \n). Если строка состоит только из символа перевода строки, то метод readline() возвращает пустую строку. Если в конце файла нет пустой строки с символом \n, то возвращаемый результат неопределён(этого допускать нельзя):

·                >>> f.readline()

·                'This is the first line of the file.\n'

·                >>> f.readline()

·                'Second line of the file\n'

·                >>> f.readline()

·                ''

  • Метод readlines([размер_строки]) читает все строки файла в список. Читаются только законченные строки. Необязательный параметр размер_строки дополняет читает строку, и если она меньше указанной длины читает дальше, до достижения указанного числа символов, такой приём эффективен для чтения очень больших файлов построчно без необходимости размещения его в памяти:

·                >>> f.readlines()

·                ['This is the first line of the file.\n', 'Second line of the file\n']

  • Метод write(строка) пишет в файл указанную строку, ничего при этом не возвращая:

·                >>> f.write('This is a test\n')

  • Метод seek(на_сколько_байт[, откуда]) перемещает указатель текущего положения файла на заданное количество байт от позиции, указанной вторым аргументом:

0(по умолчанию)

1

2

начало файла

текущая позиция в файле

конец файла

При этом, число байт для перемещения может быть как положительным, так и отрицательным(назад).

  • Метод tell() возвращает текущую позицию в файле:

·                >>> f=open('/tmp/workfile', 'r+')

·                >>> f.write('0123456789abcdef')

·                >>> f.seek(5)     # Переход к шестому байту от начала

·                >>> f.read(1)

·                '5'

·                >>> f.seek(-3, 2) # Переход к третьему байту до конца файла

·                >>> f.read(1)

·                'd'

  • Метод close() закрывает объект файла, перенося все сделанные в нём изменения на диск, возвращая ресурсы операционной системе. Обязательно закрывайте все файлы, сто больше не используете, т.к. не закрытый файл может привести к потере данных. После закрытия обращение к объекту файла автоматически вызывает ошибку

Модуль pickle

Для чтения/записи в файл используются строки. То есть вам необходимо прежде чем записать что-либо в файл преобразовать это что-то в строку. С числовыми значениями всё легко: в модуле string есть множество функций для преобразования чисел в строки и строк в числа(например, строка в целое “string.atoi()”). Но как быть со сложными объектами: списками, например. Для этой цели в Питоне существует особый модуль: pickle, который может преобразовать в строку любой объект(даже некоторый формат кода самого Питона!) и записать его в файл. При этом при помощи модуля pickle можно выполнить обратную операцию из строки, генерированной pickle, в переменную(модуль сам распознает её тип). Причём, функционирование модуля pickle одинаково в любой реализации Питона, поэтому использование подобного механизма способствует переносимости кода и помогает повторно использовать какие-либо сложные объекты. Пример использования модуля pickle(полное описание я пока не перевёл):

pickle.dump(x, f)#Выгрузка содержимого x в файл f

x = pickle.load(f)#Загрузка x из файла f.

 






При перепечатке любого материала с сайта, видимая ссылка на источник www.warayg.narod.ru и все имена, ссылки авторов обязательны.

© 2005
 

Hosted by uCoz