le087 10.01.2011 22:54
Скрипты — Мой почти первый и совсем кривой велосипед на Python
Все начилось с того, что я очень люблю слушать один подкаст! Выходит он регулярно, каждую неделю, и мне просто надоело каждый раз ползти на сайт, качать файл, потом копировать его на мой плеер.Ну и так, раз уж недавно взялся за изучение Python (ибо так нам проповедывал Эрик Реймонд; по ссылке он вам расскажет, откуда в сыре дырки =), и почему именно стоит брать например python, как первый язык программирования), то и решил написать маленький скрипт на этом замечательном языке.
Всем, кто не рубит в программировании, но интересно посмотреть, как это примерно выглядит и как не надо писать скрипты, так же приглашаю под кат.
Ниже представлено сие творение, построенное на костылях и залепленное
соплями, где только можно. Прошу серьезной критики.
Скрипт, как обычно, сохраняется в файл с расширением .py и запускается командой:
1 |
|
Теперь давайте рассмотрим потенциальные проблемы и темные моменты, которые мне уже подсказали ребата из [email protected] (огромное им спасибо), а так же те, до коих я дошел сам, пока писал этот пост.
1. Мне кажется, или все же, если при скачивании по ссылке файл окажется 8.5 гигабайтным образом двухслойного DVD-диска, то оперативная память и своп быстро кончаться?
1 |
|
2. Можно было вполне организовать проверку полученных ссылок на выбор самого последнего выложенного подкаста. И сразу же возникает вопрос, а вообще возможно, не скачивая файл, через протокол http определить дату создания этого файла?
3. Также наверное стоит переписать момент, где файл сначала сохраняется на жестком диске, в том месте, откуда был запущен скрипт, а затем перемещается с помощью shutil.move() в нужный каталог. Согласен, не достаточно хорошо изучил urllib, просто я еще учусь. Правильным делом будет сразу сохранять его в нужном месте.
4. Ребята из конференции мне уже подсказали, что Rhythmbox умеет все, что я тут наизобретал, прямо-таки из коробки. Но я вот думаю повесить этот скрипт в обязанности cron'у, и будет мне сачстье =)
Ну вот и все. Все желающие можете кидать в меня камни, а я постараюсь увернуться и обязательно прислушаюсь к вашим предложениям.
wiz 10.01.2011 23:04 #
+ 5 -
Я бы дёргал всё нужное из rss/atom лент, благо там данные специально подготовлены для парсеров.
Rhythmbox вроде именно так и поступает. Но вот я об этом не подумал. =) отличная мысль.
Ух ты, прикольно. Этой штуке место самое в моих заметках...
Все же пару шишек набить иногда полезно!
Дабы не городить ещё один велик...
Все же пару шишек набить иногда полезно!
Особо не вчитывался, но есть небольшое замечание по стилистике, для упрощения написания и чтения кода
лишние переменные и лишний текст. лучше делать так
Особенно, если нужен один только read().Ты завёл web_str и воспользовался этой переменной лишь раз, добавив к ней всего один вызов метода.
web_str = urllib.urlopen("http://site-podcasta.com")
filetext = web_str.read()
лишние переменные и лишний текст. лучше делать так
filetext = urllib.urlopen("http://site-podcasta.com").read()
Особенно, если нужен один только read().Ты завёл web_str и воспользовался этой переменной лишь раз, добавив к ней всего один вызов метода.
Так, с этим теперь ясно. В масштабах небольшого проекта, я так понимаю, это сэкономит нам немного ресурсов компьютера. В следующий раз постараюсь обосновывать создание объекта.
это с опытом придёт :) просто после написания кода, просматривай его и ищи где и что можно упростить или сократить. Иногда полчаса вдумчивого чтения помогают из 100 строк сделать 50 ;) ну а потом сразу в эти же 50 строк будешь умещать %)
и тут дело не только в производительности... через пару месяцев будет проще разобраться в коде, если там нет лишних конструкций и переменных.
и тут дело не только в производительности... через пару месяцев будет проще разобраться в коде, если там нет лишних конструкций и переменных.
localFile = open(url.split('/')<-1>, 'w') #вот тут, я не совсем сообразил что делается, но кажется тут обрезается имя файла от его урла до нормального вида
Тут урл бьется на куски с разделителем '/', в результате получаем список (или кортеж, не помню точно), из которого берем первый элемент с конца (т.е. самый последний). Отрицательный индекс говорит о том, что счет идет с конца.
webFile.close() #наверно, это у программистов называется освободить память
В данном случае это называется "закрыть поток". С файлом то же самое. А открывал ты его тут:
webFile = urllib.urlopen(url) #качаем файл
Комментарий твой ошибочен. Ибо качать ты начинаешь только тогда, когда читаешь из потока. Кстати, читать советую порциями, можно даже прогрессбар замутить.
/home/user/music/podcasts/
Этот кусок строки у тебя повторяется много раз. Поэтому лучше вынеси его "константой" в шапку скрипта, и в дальнейшем использовать ее в скрипте. Например как-то так:
PODCAST_PATH = '/home/user/music/podcasts/'
Вроде все, что разглядел в скрипте из того, что можно поправить или дсказать =)
...качать ты начинаешь только тогда, когда читаешь из потока.
Так, потихоньку некоторые моменты становятся более понятными. Получается, что все же 8.5 гигабайт не забьют все мою память и своп! Это отлично!
Кстати, читать советую порциями, можно даже прогрессбар замутить.
Об этом я тоже думал, потому как ждать, пока скачается аж 70-80 мб, ну не прикольно со всем =). Это будет домашним заданием.
Благодарю за ценный коммент.
По ссылке находится статья Эрика Реймонда, "Как стать хакером". В этой статье он объясняет, кто эти хакеры на самом деле, и как ими стать. Это целое руководство к действию.
В отношении языков программирования, он предлагает изучить четыре. Первым из них должен быть Python, как простой в понимании и написании, но все же очень мощный. Следующим должен идти Си, потому что это язык операционной системы UNIX (по его мнению, у начинающего компьютерщика обязательно должен быть дома один из UNIX'ов), заканчивают список Perl и Lisp. Вот например Lisp мне тоже хочется поковырять, причина в emacs, который я последнее время использую все чаще. Статья очень давняя, но в большинстве своем не потеряла актуальности. Рекомендую к прочтению всем начинающим IT-специалистам.
В отношении языков программирования, он предлагает изучить четыре. Первым из них должен быть Python, как простой в понимании и написании, но все же очень мощный. Следующим должен идти Си, потому что это язык операционной системы UNIX (по его мнению, у начинающего компьютерщика обязательно должен быть дома один из UNIX'ов), заканчивают список Perl и Lisp. Вот например Lisp мне тоже хочется поковырять, причина в emacs, который я последнее время использую все чаще. Статья очень давняя, но в большинстве своем не потеряла актуальности. Рекомендую к прочтению всем начинающим IT-специалистам.
filename = url.split('/')<-1>
shutil.move(filename, "/home/user/Music/podcasts/")
# И вот этого можно не делать:
spisok_files = os.listdir(".") #получаем список файла в директории, из которой запускался скрипт, что бы затем этот файл перекинуть в нужный нам каталог
print "Перемещение файла в каталог подкастов"
for i in spisok_files: #цикл перебирает список файлов, и находит тот, который нам нужен
if 'file_podcast' in i:
shutil.move(i, "/home/user/Music/podcasts/") #перемещаем файл в указанный каталог
Просто подкаст давно всем известен, и я не стал лишний раз его упоминать. Вот ссылочка:
http://radio-t.com
Я его слушаю, аж с ноября 2007 года. Ведущие, вполне достойны внимания многих с welinux, но это мое, и только мое мнение. Если кто еще не слушал, очень рекомендую попробовать.
http://radio-t.com
Я его слушаю, аж с ноября 2007 года. Ведущие, вполне достойны внимания многих с welinux, но это мое, и только мое мнение. Если кто еще не слушал, очень рекомендую попробовать.
Черт, все гениальное просто! =) Многие вещи ООП в python у меня еще не осели на стенки головного мозга. Еще одна прекрасная оптимизация. Обязательно добавлю, вернее убавлю лишние строчки.
Только не увлекитесь ;). А то вон RMS тоже последнее время вызывает у широкой общественности, периодически, сомнения в его адекватности. Хотя ему простительно, чувак реально много сделал для Open Source, простите, для Free Software.
:) Ну, текст замечательно увязывает мои интересы. :)
Подозреваю, что его самого эти сомнения довольно мало волнуют. :)
Подозреваю, что его самого эти сомнения довольно мало волнуют. :)
Это чем-то лучше , чем скриптинг с использованием шелла , седа, курла, вгета?
Имхо для таких задач не нужно изучать специально питон, можно использоват ьсредства которые используются в повседневной жизни в линукс (включая те что я перечислил). Если не прав - простите.
ps. Однажды Мастер Фу сказал заезжему программисту: "В одной строке кода shell-сценария больше духа UNIX, чем в десяти тысячах строк на языке С!"
Имхо для таких задач не нужно изучать специально питон, можно использоват ьсредства которые используются в повседневной жизни в линукс (включая те что я перечислил). Если не прав - простите.
ps. Однажды Мастер Фу сказал заезжему программисту: "В одной строке кода shell-сценария больше духа UNIX, чем в десяти тысячах строк на языке С!"
Хм, тогда беру свои слова обратно, если это цель. Хотя, если чесно, цель не очень понятная - прикладной софт на питоне совсем не то что на си. Говоря короче - тормоз заметный на глаз. Для автоматизации можно поучить... Но в общем-то для этого и шелла хватает. В общем я не вижу радости от того, что софта на питоне может стать больше :) И мне как юзеру скорость разработки не важна - только на сколько хорошо работает программа (включая скорость).
ps. Какой-то демотиватор из меня получился :)
ps. Какой-то демотиватор из меня получился :)
Все правильно =). Я просто пытаюсь постичь основы программирования, решая попутно возникающие проблемы с помощью этого же программирования. Python прежде всего потому, что он легко читается, более прост в понимании. Уясню фундаментальные основы, начну чувствовать себя уютно среди строк программного кода, займусь следующим, например тем же Си. Это просто мое любопытство и желание разобраться.
А еще есть метод urllib.urlretrieve(url, fileName).
Предпочтительнее использовать его. ЕМНИП, когда качаешь файл с помощью urlopen, то сначала все данные поступают в оперативку, а потом вы самостоятельно записываете на жесткий диск данные и "очищаете" оперативку. urlretrieve регулярно "сбрасывает" полученные данные в файл, не занимая место в оперативной памяти.
Да ителодвиженийстрок кода меньше :)
Предпочтительнее использовать его. ЕМНИП, когда качаешь файл с помощью urlopen, то сначала все данные поступают в оперативку, а потом вы самостоятельно записываете на жесткий диск данные и "очищаете" оперативку. urlretrieve регулярно "сбрасывает" полученные данные в файл, не занимая место в оперативной памяти.
Да и
Вот это очень важный момент. Значит все же, если я буду качать так 8.5 гигабайт, то у меня кончится оперативная память. Или не кончиться? =) Вашим советом обязательно воспользуюсь.