Работа с файлами
Содержание
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=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 содержится список строк о том, как
- 1) вызывали программу
- 2) а также все, что пользователь написал после.
иначе говоря, все то, что было написано в командной строке.
Для того, чтобы автоматизировать разбор командной строки подобно программе 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