Kodomo

Пользователь

Работа с файлами


off-top
В Mercurial есть такое понятие как tag. Запись

   1 hg tag 3.0

означает, что текущая версия помечена как 3.0


Как работать с файлами.

Открытие файла.

Для начала необходимо открыть файл. Для этого надо написать следующую команду:

   1 file = open('file.txt')

Замечание 1. Файлы по умолчанию открываются на чтение, однако это можно указать в явном виде параметром r (от read):

   1 file = open('file.txt','r')

Замечание 2. Вместо file можно писать любое обозначение (кроме уже занятых), например f, file1 и т.д. Это бывает очень удобно для работы с многими файлами одновременно.

Чтение файла.

Чтение по строкам

Если мы представляем файл на место списка, то Питон будет его понимать как список его, т.е. файла, строк.

   1 for line in file:
   2         print line

Если мы распечатаем каждую строку таким образом, то в итоге на экране мы увидим все строки через пробел (пустую строку). Это произойдет из-за того, что в файле в конце каждой строки стоит символ '\n', а print автоматически прибавляет этот символ к концу печатаемого объекта. О решении этой проблемы поговорим чуть позже (см. Работа со строками и всякие полезные вещи при работе с файлами).


Офф-топ.
Кстати, про циклы. Команда break означает выйти из цикла, а команда continue - выполнить следующую итерацию.


Чтение по байтам.

   1 bytes=file.read(1)

метод .read(1) возвращает строку bytes, в которой будет находиться 1 байт, прочитанный из файла.

Чтение целиком.

Самым удобным способом чтения файла является его запись в 1 строку целиком с помощью метода .read():

   1 contents=file.read()

Запись в файл.

О том, что в файл будет что-то записываться, надо указать при открытии:

   1 file=open('file.txt','w')

'w' от write.

Если файла file.txt не существует, то он будет создан, если он есть, то все его содержимое будет стерто, и на его месте будет записываться что-то новое.

Замечание. Что делать, если мы хотим дописать в файл? Для этого существуют еще один параметр 'a' (от 'append'): file=open('file.txt','a')

Замечание. Про все остальные режимы открытия файла читайте Tutorial по Python на его официальном сайте=)

Собственно записать в файл:

   1 file.write("hello!\n")

Внимание! Метод .write в отличие от print символ '\n' автоматически не прибавляет!

Работа со строками и всякие полезные вещи при работе с файлами.

Итак, вернемся к чтению по строкам.

   1 for line in file:
   2         print line

Как уже было сказано, у нас возникает проблема с удвоением '\n'. Избавиться от этого лишнего пробельного символа можно разными способами.

.strip()

strip отрезает с начала и конца строки те символы, которые указаны в его аргументах (т.е. в скобках). Пустые скобки означают пробельные символы

   1 >>> a=" \t 1 2 "
   2 >>> a.strip()
   3 '1 2'

Важно! Строки, как и кортежи, нельзя изменить, поэтому при их любой обработке каким-то методом будет возвращаться новая строка!

То есть:

   1 >>> a=" \t 1 2 "
   2 >>> a.strip()
   3 '1 2'
   4 >>> a
   5 " \t 1 2 "

Если мы напишем:

   1 >>> a=a.strip()

то a изменит адрес, однако исходная строка останется прежней.

Еще примеры со strip:

   1 >>> '123abc231'.strip('12')
   2 '3abc23'

Как уже было сказано, strip обрезает с начала и конца строки все символы, которые указаны в его аргументах. Он работает только посимвольно! Поэтому с его помощью нельзя вырезать из строки '123abc231' число 12.

Вернемся к нашей проблеме. Метод strip() можно использовать, однако он удалит еще пробелы и в начале, что уже не есть хорошо. Чтобы избежать этого, надо указать в аргументах символ '\n', который обычно присутствует только в конце. Для полной уверенности можно использовать разновидность метода strip - rstrip, который вырезает символы с правого конца (аналогично, существует метод lstrip для левого). Тогда:

   1 for line in file:
   2         print line.rstrip('\n')

2) другой способ заключается в использовании модуля sys.

   1 import sys

В файл sys.stdin читается все, что пишется с клавиатуры. Файлы sys.stdout и sys.stderr по сути одно и тоже (вывод на экран). Однако в файл stdout обычно пишется внешний вывод (содержательная выдача), а в файл stderr всевозможные ошибки. Но можно выбрать, куда направить выходные данные. В этом случае:

   1 import sys
   2 for line in open('hello.txt')
   3         sys.stdout.write(line)

Таким образом, в файл sys.stdout построчно перезапишится весь файл hello.txt.

Работа со строками. Продолжение.

.split()

Разбить строку на элементы списка можно с помощью метода .split()

   1 >>> " \t 1 2 ".split()
   2 ['1','2']  

В данном случае split() возвращает список, элементами которого

Ниже в примере _ означает пробел!

   1 >>> '1,_2,_3,4,_5'.split(',_') # в аргументе split указываем разделитель на элементы
   2 ['1','2','3,4','5']
   3 >>> a='1,_2,_3,4,_5'.split(',')
   4 ['1','_2','_3','4','_5']

Избавимся от пробелов в списке a:

   1 line=[]
   2 for word in a:
   3         line.append(int(word))

split() при разбиении выкидывает пробелы в начале и в конце строки (смотри пример выше), а split(" ") нет!

   1 >>> ',,1,2,,3'.split(',')
   2 ['','','1','2','','3']

split("строка") разбивает по строке, а не по символам, из которых она состоит!

split(x,y): x - разделитель, y - вернуть первые y разбиений.

   1 >>>  ',,1,2,,3'.split(',',2)
   2 ['','','1,2,,3']
   3 >>>  '1'.split(',',2)
   4 ['1']

Разбор командной строки с помощью optparse

Когда мы вызываем программу через командную строку, мы можем также указывать ее параметры (если они есть).

Например, вспомним команду ls. Ее можно вызвать с различными параметрами.

ls -lR
ls --long --recursive
ls -l -R

Все три записи выше равнозначны между собой.

ls --sort=time # параметры могут принимать какое-то значение
ls a.txt b.txt

Если параметр написан через знак дефиса, то он называется именованным, иначе – позиционным.

В переменной sys.argv содержится список строк о том, как

иначе говоря, все то, что было написано в командной строке.

Для того, чтобы автоматизировать разбор командной строки подобно программе ls, надо импортировать библиотеку optparse.

   1 import optparse
   2 parser=optparse.OptionParser()

parser - это так называемый объект-разборщик (далее будем называть его просто парсером).

Разберем это на примере программы сортировки (пусть будет называться sort.py).

Пусть для нее можно будет указывать два параметра:

-r --reverse
-w --word

Для этого надо прописать:

   1 import optparse
   2 parser=optparse.OptionParser()
   3 parser.add_option('-w', '--word', help='word number to sort by', type='int', default=0)
   4 parser.add_option('-r', '--reverse', action='store_true', help='reverse sort order')
   5 options, args=parser.parse_args()
   6 options.word
   7 options.reverse

Итак, парсер будет разбирать слово, стоящее после записи '-w' ('--word') или '-r' ('--reverse'). Для '-w' оно должно быть целым числом и по умолчанию равно 0. В args будут записываться все то, что парсер не смог разобрать. Фраза action='store_true' означает, что данный параметр является флагом. Если бы этого не было, то параметр нёс бы какое-то значение.

Рассмотрим диалог с командной строкой:

$ python sort.py

None
0
[]

$ python sort.py -r -w 1 a.txt
True
1
['a.txt']

$ python sort.py --help

Options:
  -h, --help            show this help message and exit
  -w WORD, --word=WORD  word number to sort by
  -r, --reverse         reverse sort order

$ python sort.py -x

sort.py [options]

sort.py: error: no such option: -x