
Довольно давно я написал статью, в которой приводил примеры основ работы с системой с помощью Python-скриптов. Из-за мельком оброненной фразы (достаточно взглянуть на название топика) статья получила довольно много комментариев холиварного и не очень характера. Кому-то, возможно, захотелось воспользоваться возможностями Python для администрирования (сейчас подобного рода тулзы на питоне как раз набирают популярность). Так почему бы не завлечь в свой стан еще немного единомышленников? :) Встречайте — небольшая подборка простых приемов для тех или иных целей.
Файлы и кое-что еще
Итак, сразу с места в карьер! Для начала возьмем банальную процедуру — копирование файла. До сих пор помню этот ужас, который приходилось писать на голом Си — считывание файла построчно в переменную и перезапись его по другому адресу… Но ведь вполне можно воспользоваться и более простыми методами! :) Первый способ, который придет в голову линуксоиду — это, скорее всего, что-то вроде
Copy Source | Copy HTML
- import subprocess
- subprocess.Popen('cp /usr/share/file.txt /home/user/file.txt', shell=True)
Только вот подобный способ будет работать только при наличии bash или подобного ему интерпретатора (ну или потребует прописания алиасов). Зачем? Ведь можно воспользоваться методом отличного модуля shutil:
Copy Source | Copy HTML
- import shutil
- shutil.copyfile("C:\\My Documents\\mydoc.doc", "C:\\My Documents\\mydoc_2.doc")
Переименование делается похожим образом:
Copy Source | Copy HTML
- import os
- os.rename("/home/user/testfile.txt", "/home/user/test.txt")
Удалить файл можно, соответственно, с помощью os.remove().
Для записи данных в файл можно использовать как питоновый write(), так и «поточный» вариант (сиплюсплюсники, привет вам):
Copy Source | Copy HTML
- myfile = open("/home/user/testfile.txt", "w")
- print>>myfile, "I want to drink some beer with Guido"
- myfile.close()
upd: Более современный метод от юзернейма

>> from __future__ import with_statement ):
Copy Source | Copy HTML
- with open("/home/user/testfile.txt", "w") as myfile:
- print>>myfile, "I want to drink some beer with Guido"
Иногда (например, при чтении логов) вам может понадобиться читать файл построчно, начиная с конца. Делается это элементарно:
Copy Source | Copy HTML
- for line in reversed(open("/var/log/messages").readlines()):
- print line
А чтобы прочесть строку под определенным номером — можно воспользоваться как стандартным чтением файла в лист, так и использовать модуль linecache:
Copy Source | Copy HTML
- line = linecache.getline("C:\\test.txt", 2)
- print line
- # or
- line = open("C:\\test.txt").readlines()[1]
- print line
Кстати, бинарный файл читать ничуть не сложнее:
Copy Source | Copy HTML
- pic = open("C:\\Pictures\\V4erashnaya_pyanka.bmp", "rb")
- buf = pic.read(5) # считываем первые 5 байт
- print buf
Кроме того, чтобы не заблудиться:
Copy Source | Copy HTML
- print pic.tell() # число байт с начала файла
- pic.seek(0) # назад в начало
Если, например, мы пишем программу с поддержкой плагинов — нам может понадобиться перебор файлов в определенном каталоге:
Copy Source | Copy HTML
- for filename in os.listdir("../plugins"):
- print(filename)
Причем можно делать то же самое по маске:
Copy Source | Copy HTML
- import glob
- for filename in glob.glob("../plugins/*.zip"):
- print filename
Парсим пути:
Copy Source | Copy HTML
- print os.path.dirname("/home/user/test.txt") #имя каталога
- print os.path.basename("/home/user/test.txt") #имя файла
Открываем адрес или локальный файл в браузере по умолчанию (например, при создании ссылок в about-окошках):
Copy Source | Copy HTML
- import webbrowser
- webbrowser.open('http://www.habrahabr.ru/')
- webbrowser.open(u'file://home/user/mysite.html')
- webbrowser.open(u'mailto:foo@bar.com?subject=Feedback%20message')
Для определения кодировки строки или файла можно воспользоваться удобным модулем chardet, причем возвращается не только кодировка, но и «уверенность» в том, что она определена правильно, в красивом словарике:
Copy Source | Copy HTML
- import chardet
- str = open("/home/user/myfile.txt","r").readline()
- enc = chardet.detect(str)
- print enc['confidence']
- print enc['encoding']
Очень удобная вещь когда нужно, например, заюникодить строку с заранее неизвестной кодировкой. Правда, я столкнулся с проблемой определения mac-кодировок (всегда возвращается простой ascii, но на то он и мак, что часть символов кодируется не как обычно). В любом случае, линуксоидам легче — у нас есть enca и iconv :)
Ну что, пока хватит? Если тенденция понравится — попробую продолжить описание применения Python для администрирования системы и напишем пару рабочих примеров. И да, огромное спасибо такой вещи, как Python Cookbook!