Работа с файлами
Содержание
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 и т.д. Это бывает очень удобно для работы с многими файлами одновременно.
Чтение файла.
Чтение по строкам
Если мы представляем файл на место списка, то Питон будет его понимать как список его, т.е. файла, строк.
Если мы распечатаем каждую строку таким образом, то в итоге на экране мы увидим все строки через пробел (пустую строку). Это произойдет из-за того, что в файле в конце каждой строки стоит символ '\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' автоматически не прибавляет!
Работа со строками и всякие полезные вещи при работе с файлами.
Итак, вернемся к чтению по строкам.
Как уже было сказано, у нас возникает проблема с удвоением '\n'. Избавиться от этого лишнего пробельного символа можно разными способами.
.strip()
strip отрезает с начала и конца строки те символы, которые указаны в его аргументах (т.е. в скобках). Пустые скобки означают пробельные символы
Важно! Строки, как и кортежи, нельзя изменить, поэтому при их любой обработке каким-то методом будет возвращаться новая строка!
То есть:
Если мы напишем:
1 >>> a=a.strip()
то a изменит адрес, однако исходная строка останется прежней.
Еще примеры со strip:
Как уже было сказано, strip обрезает с начала и конца строки все символы, которые указаны в его аргументах. Он работает только посимвольно! Поэтому с его помощью нельзя вырезать из строки '123abc231' число 12.
Вернемся к нашей проблеме. Метод strip() можно использовать, однако он удалит еще пробелы и в начале, что уже не есть хорошо. Чтобы избежать этого, надо указать в аргументах символ '\n', который обычно присутствует только в конце. Для полной уверенности можно использовать разновидность метода strip - rstrip, который вырезает символы с правого конца (аналогично, существует метод lstrip для левого). Тогда:
2) другой способ заключается в использовании модуля sys.
1 import sys
В файл sys.stdin читается все, что пишется с клавиатуры. Файлы sys.stdout и sys.stderr по сути одно и тоже (вывод на экран). Однако в файл stdout обычно пишется внешний вывод (содержательная выдача), а в файл stderr всевозможные ошибки. Но можно выбрать, куда направить выходные данные. В этом случае:
Таким образом, в файл sys.stdout построчно перезапишится весь файл hello.txt.
Работа со строками. Продолжение.
.split()
Разбить строку на элементы списка можно с помощью метода .split()
В данном случае split() возвращает список, элементами которого
- являются слова, разделенные в исходной строке пробельными символами.
Ниже в примере _ означает пробел!
Избавимся от пробелов в списке a:
split() при разбиении выкидывает пробелы в начале и в конце строки (смотри пример выше), а split(" ") нет!
split("строка") разбивает по строке, а не по символам, из которых она состоит!
split(x,y): x - разделитель, y - вернуть первые y разбиений.
Разбор командной строки с помощью optparse
Когда мы вызываем программу через командную строку, мы можем также указывать ее параметры (если они есть).
Например, вспомним команду ls. Ее можно вызвать с различными параметрами.
ls -lR ls --long --recursive ls -l -R
Все три записи выше равнозначны между собой.
ls --sort=time # параметры могут принимать какое-то значение ls a.txt b.txt
Если параметр написан через знак дефиса, то он называется именованным, иначе – позиционным.
В переменной sys.argv содержится список строк о том, как
- 1) вызывали программу
- 2) а также все, что пользователь написал после.
иначе говоря, все то, что было написано в командной строке.
Для того, чтобы автоматизировать разбор командной строки подобно программе ls, надо импортировать библиотеку optparse.
parser - это так называемый объект-разборщик (далее будем называть его просто парсером).
Разберем это на примере программы сортировки (пусть будет называться sort.py).
Пусть для нее можно будет указывать два параметра:
-r --reverse -w --word
Для этого надо прописать:
Итак, парсер будет разбирать слово, стоящее после записи '-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