http://wiki.linuxformat.ru/wiki/index.php?title=LXF97:Python&feed=atom&action=historyLXF97:Python - История изменений2024-03-29T15:12:02ZИстория изменений этой страницы в викиMediaWiki 1.19.20+dfsg-0+deb7u3http://wiki.linuxformat.ru/wiki/index.php?title=LXF97:Python&diff=5644&oldid=prevCrazy Rebel: /* Python и музон */2008-11-27T06:29:51Z<p><span dir="auto"><span class="autocomment">Python и музон</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr valign='top'>
<td colspan='2' style="background-color: white; color:black;">← Предыдущая</td>
<td colspan='2' style="background-color: white; color:black;">Версия 06:29, 27 ноября 2008</td>
</tr><tr><td colspan="2" class="diff-lineno">Строка 66:</td>
<td colspan="2" class="diff-lineno">Строка 66:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>=== Python и музон ===</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>=== Python и музон ===</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><<del class="diffchange diffchange-inline">code</del>></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><<ins class="diffchange diffchange-inline">source lang=python</ins>></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  import os</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  import os</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  topdir="/usr/share/music/"</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  topdir="/usr/share/music/"</div></td></tr>
<tr><td colspan="2" class="diff-lineno">Строка 78:</td>
<td colspan="2" class="diff-lineno">Строка 78:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>     for entry in dirs[1]:</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>     for entry in dirs[1]:</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>       print dirs[1]</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>       print dirs[1]</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div></<del class="diffchange diffchange-inline">code</del>></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></<ins class="diffchange diffchange-inline">source</ins>></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>В данном примере мы сначала импортируем модуль os, затем</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>В данном примере мы сначала импортируем модуль os, затем</div></td></tr>
<tr><td colspan="2" class="diff-lineno">Строка 86:</td>
<td colspan="2" class="diff-lineno">Строка 86:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>walklist должны выглядеть примерно так:</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>walklist должны выглядеть примерно так:</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><<del class="diffchange diffchange-inline">code</del>></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><<ins class="diffchange diffchange-inline">source lang=python</ins>></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  ('/usr/share/music/Blonde_Redhead', ['1980 Forward', '23'], [])</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  ('/usr/share/music/Blonde_Redhead', ['1980 Forward', '23'], [])</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>  ('/usr/share/music/Blonde_RedHead/1980 Forward', [], ['18-Magic</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div>  ('/usr/share/music/Blonde_RedHead/1980 Forward', [], ['18-Magic Mountain.mp3'])</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><del class="diffchange diffchange-inline"> </del>Mountain.mp3'])</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div>  ('/usr/share/music/Blonde_Redhead/23', [], ['10-My Impure Hair.mp3','1-23.mp3', '7-Publisher.mp3', '3-The Dress.mp3', '6-Silently.mp3'])</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>  ('/usr/share/music/Blonde_Redhead/23', [], ['10-My Impure Hair.</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></<ins class="diffchange diffchange-inline">source</ins>></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><del class="diffchange diffchange-inline"> </del>mp3','1-23.mp3', '7-Publisher.mp3', '3-The Dress.mp3', '6-Silently.</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><del class="diffchange diffchange-inline"> </del>mp3'])</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div></<del class="diffchange diffchange-inline">code</del>></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Теперь пошагово проверим каждую строку. Если элемент строки</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Теперь пошагово проверим каждую строку. Если элемент строки</div></td></tr>
<tr><td colspan="2" class="diff-lineno">Строка 123:</td>
<td colspan="2" class="diff-lineno">Строка 120:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>примет такой вид:</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>примет такой вид:</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><<del class="diffchange diffchange-inline">code</del>></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><<ins class="diffchange diffchange-inline">source lang=python</ins>></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  for file in dirs[2]:</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  for file in dirs[2]:</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>   fullpath = os.path.join(dirs[0],file)</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>   fullpath = os.path.join(dirs[0],file)</div></td></tr>
<tr><td colspan="2" class="diff-lineno">Строка 139:</td>
<td colspan="2" class="diff-lineno">Строка 136:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>     # Что-нибудь с ним сделаем.</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>     # Что-нибудь с ним сделаем.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>     print fullpath</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>     print fullpath</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div></<del class="diffchange diffchange-inline">code</del>></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></<ins class="diffchange diffchange-inline">source</ins>></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Мы также должны объявить три переменных типа «список» в</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Мы также должны объявить три переменных типа «список» в</div></td></tr>
<tr><td colspan="2" class="diff-lineno">Строка 166:</td>
<td colspan="2" class="diff-lineno">Строка 163:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>файла, и выглядит это примерно так:</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>файла, и выглядит это примерно так:</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><<del class="diffchange diffchange-inline">code</del>></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><<ins class="diffchange diffchange-inline">source lang=python</ins>></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  mytag=eyeD3.Tag()</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  mytag=eyeD3.Tag()</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  mytag.link('/usr/share/music/Blonde_Redhead/23/1-23.mp3')</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  mytag.link('/usr/share/music/Blonde_Redhead/23/1-23.mp3')</div></td></tr>
<tr><td colspan="2" class="diff-lineno">Строка 172:</td>
<td colspan="2" class="diff-lineno">Строка 169:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  print mytag.getAlbum()</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  print mytag.getAlbum()</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  print mytag.getTrackNum()</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  print mytag.getTrackNum()</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div></<del class="diffchange diffchange-inline">code</del>></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></<ins class="diffchange diffchange-inline">source</ins>></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Изменив любой из тэгов, просто вызовите метод tag.update(), и</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Изменив любой из тэгов, просто вызовите метод tag.update(), и</div></td></tr>
<tr><td colspan="2" class="diff-lineno">Строка 226:</td>
<td colspan="2" class="diff-lineno">Строка 223:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>браться и позже, не затрагивая основной код.</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>браться и позже, не затрагивая основной код.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><<del class="diffchange diffchange-inline">code</del>></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><<ins class="diffchange diffchange-inline">source lang=python</ins>></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  if (extension !='.mp3'):</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  if (extension !='.mp3'):</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>   # Не файл MP3? Проверить на другие расширения?</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>   # Не файл MP3? Проверить на другие расширения?</div></td></tr>
<tr><td colspan="2" class="diff-lineno">Строка 293:</td>
<td colspan="2" class="diff-lineno">Строка 290:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>     # Выдадим предупреждение</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>     # Выдадим предупреждение</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>     logger.warn(" file %s does not seem to be a valid mp3 file",fullpath)</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>     logger.warn(" file %s does not seem to be a valid mp3 file",fullpath)</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div></<del class="diffchange diffchange-inline">code</del>></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></<ins class="diffchange diffchange-inline">source</ins>></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Полная распечатка этого небольшого скрипта представлена на</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Полная распечатка этого небольшого скрипта представлена на</div></td></tr>
<tr><td colspan="2" class="diff-lineno">Строка 346:</td>
<td colspan="2" class="diff-lineno">Строка 343:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>скрипта:</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>скрипта:</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><<del class="diffchange diffchange-inline">code</del>></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><<ins class="diffchange diffchange-inline">source lang=python</ins>></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  logger = logging.getLogger("pymusic")</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  logger = logging.getLogger("pymusic")</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  # Создать обработчик консоли</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  # Создать обработчик консоли</div></td></tr>
<tr><td colspan="2" class="diff-lineno">Строка 356:</td>
<td colspan="2" class="diff-lineno">Строка 353:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  logger.addHandler(handler)</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  logger.addHandler(handler)</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  logger.setLevel(logging.WARN)</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  logger.setLevel(logging.WARN)</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div></<del class="diffchange diffchange-inline">code</del>></div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></<ins class="diffchange diffchange-inline">source</ins>></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Часть этих штук смахивает на волшебство, и кое-кто считает модуль ведения журнала непостижимым, но на самом деле все очень просто. Если вы хотите узнать больше, документация</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Часть этих штук смахивает на волшебство, и кое-кто считает модуль ведения журнала непостижимым, но на самом деле все очень просто. Если вы хотите узнать больше, документация</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>находится здесь: http://docs.python.org/lib/module-logging.html. Фактически, всё, что необходимо</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>находится здесь: http://docs.python.org/lib/module-logging.html. Фактически, всё, что необходимо</div></td></tr>
</table>Crazy Rebelhttp://wiki.linuxformat.ru/wiki/index.php?title=LXF97:Python&diff=5340&oldid=prevCrazy Rebel в 07:33, 17 ноября 20082008-11-17T07:33:27Z<p></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr valign='top'>
<td colspan='2' style="background-color: white; color:black;">← Предыдущая</td>
<td colspan='2' style="background-color: white; color:black;">Версия 07:33, 17 ноября 2008</td>
</tr><tr><td colspan="2" class="diff-lineno">Строка 1:</td>
<td colspan="2" class="diff-lineno">Строка 1:</td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">[[Категория:Учебники]]</ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>== Python: Управляемся ==</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>== Python: Управляемся ==</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>''Надоело мириться с дезориентирующими тэгами и нелепыми именами файлов?</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">: </ins>''Надоело мириться с дезориентирующими тэгами и нелепыми именами файлов? Укодируйте их до полного исчезновения с помощью '''Ника Вейча''' и магии Python!''</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>Укодируйте их до полного исчезновения с помощью '''Ника Вейча''' и магии Python!''</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Правда-правда, я ужасно люблю порядок: все вещи на своем</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Правда-правда, я ужасно люблю порядок: все вещи на своем</div></td></tr>
</table>Crazy Rebelhttp://wiki.linuxformat.ru/wiki/index.php?title=LXF97:Python&diff=4528&oldid=prevLockal: восстановление кавычек в коде AWB2008-04-27T14:43:17Z<p>восстановление кавычек в коде <a href="/wiki/index.php?title=Linuxformat:AutoWikiBrowser&action=edit&redlink=1" class="new" title="Linuxformat:AutoWikiBrowser (страница не существует)">AWB</a></p>
<a href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF97:Python&diff=4528&oldid=2795">Внесённые изменения</a>Lockalhttp://wiki.linuxformat.ru/wiki/index.php?title=LXF97:Python&diff=2795&oldid=prevOWeRQ в 23:45, 19 марта 20082008-03-19T23:45:51Z<p></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr valign='top'>
<td colspan='2' style="background-color: white; color:black;">← Предыдущая</td>
<td colspan='2' style="background-color: white; color:black;">Версия 23:45, 19 марта 2008</td>
</tr><tr><td colspan="2" class="diff-lineno">Строка 246:</td>
<td colspan="2" class="diff-lineno">Строка 246:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>     if b and not a:</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>     if b and not a:</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>       # Имеется только тэг ID3v1</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>       # Имеется только тэг ID3v1</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div> </div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>print “version1 only”</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div> </div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins># Создать информацию для tag2 по tag1</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>print “version1 only”</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>print fullpath</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div># Создать информацию для tag2 по tag1</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>artist = tag1.getArtist()</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>print fullpath</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>album = tag1.getAlbum()</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>artist = tag1.getArtist()</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>title = tag1.getTitle()</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>album = tag1.getAlbum()</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>print artist,album,title</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>title = tag1.getTitle()</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>tag1.update(eyeD3.ID3_V2)</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>print artist,album,title</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins># check tags are cool</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>tag1.update(eyeD3.ID3_V2)</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">    </ins>elif a and not b:</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div># check tags are cool</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins># Имеется только тэг ID3v2</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>elif a and not b:</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>print fullpath</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div># Имеется только тэг ID3v2</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>artist = tag2.getArtist()</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>print fullpath</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>album = tag2.getAlbum()</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>artist = tag2.getArtist()</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>title = tag2.getTitle()</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>album = tag2.getAlbum()</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>print artist,album,title</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>title = tag2.getTitle()</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>try:</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>print artist,album,title</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">        </ins>tag2.update(eyeD3.ID3_V1_1)</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>try:</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>except UnicodeEncodeError:</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>tag2.update(eyeD3.ID3_V1_1)</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">        </ins>logger.error(“tag invalid for v1.1 in file %s”, fullpath)</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>except UnicodeEncodeError:</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">    </ins>elif a and b:</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>logger.error(“tag invalid for v1.1 in file %s”,</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins># Имеются оба тэга</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>fullpath)</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>logger.info( “both versions fine %s”, fullpath)</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>elif a and b:</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">    </ins>else:</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div># Имеются оба тэга</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins># Тэгов нет вообще</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>logger.info( “both versions fine %s”, fullpath)</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>logger.warn(‘this file has no tags! %s’, fullpath)</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>else:</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>error_flag = True</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div># Тэгов нет вообще</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins># М.б. удастся вытянуть что-нибудь из имени каталога, где сидит файл!</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>logger.warn(‘this file has no tags! %s’, fullpath)</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">    </ins>if not error_flag:</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>error_flag = True</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins># Пускай имя файла будет</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div># М.б. удастся вытянуть что-нибудь из имени</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins># number-name.mp3</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>каталога, где сидит файл!</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>title=tag2.getTitle()</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>if not error_flag:</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>title = title.replace(‘ ‘,’_’)</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div># Пускай имя файла будет</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>n=tag2.getTrackNum()</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div># number-name.mp3</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins># Номер (number) у нас есть</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>title=tag2.getTitle()</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>ns = str(n[0])</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>title = title.replace(‘ ‘,’_’)</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>if len(ns)==1:</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>n=tag2.getTrackNum()</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">          </ins>ns= ‘0’+ns</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div># Номер (number) у нас есть</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">    </ins>ns=ns+’-’+title+’.mp3’</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>ns = str(n[0])</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">    </ins># Уберем нехорошие символы</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>if len(ns)==1:</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">    </ins>ns=sanitize(ns)</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>ns= ‘0’+ns</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">    </ins>if (file!=ns):</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>ns=ns+’-’+title+’.mp3’</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>logger.info(“change filename suggested for %s, to %s!”,filename,ns)</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div># Уберем нехорошие символы</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">      </ins>os.rename(fullpath, os.path.join(dirs[0],ns)</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>ns=sanitize(ns)</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">  </ins>else:</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>if (file!=ns):</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">    </ins># Выдадим предупреждение</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>logger.info(“change filename suggested for %s, to</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins class="diffchange diffchange-inline">    </ins>logger.warn(“ file %s does not seem to be a valid mp3 file”,fullpath)</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>%s!”,filename,ns)</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>os.rename(fullpath, os.path.join(dirs[0],ns)</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>else:</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div># Выдадим предупреждение</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>logger.warn(“ file %s does not seem to be a valid mp3</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>file”,fullpath)</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div></code></div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div></code></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
</table>OWeRQhttp://wiki.linuxformat.ru/wiki/index.php?title=LXF97:Python&diff=2794&oldid=prevOWeRQ: Новая: == Python: Управляемся == ''Надоело мириться с дезориентирующими тэгами и нелепыми именами файлов? Укодиру...2008-03-19T23:40:47Z<p>Новая: == Python: Управляемся == ''Надоело мириться с дезориентирующими тэгами и нелепыми именами файлов? Укодиру...</p>
<p><b>Новая страница</b></p><div>== Python: Управляемся ==<br />
''Надоело мириться с дезориентирующими тэгами и нелепыми именами файлов?<br />
Укодируйте их до полного исчезновения с помощью '''Ника Вейча''' и магии Python!''<br />
<br />
Правда-правда, я ужасно люблю порядок: все вещи на своем<br />
месте, все под рукой, и вы можете мигом определить, что<br />
есть, чего нет; и всякое такое. Впрочем, люди, видевшие фото<br />
моего рабочего стола или совавшие нос в мой бельевой ящик, пожалуй, оторопеют от явной лживости этого высказывания. Но, пожалуйста, внимательно прочтите его еще раз: я сказал, что люблю порядок, а<br />
вовсе не что я люблю его наводить. Моя мечта – чтобы во всех комнатах моего дома стояло по хитроумной мусорной корзине, связанной с<br />
этаким интеллектуальным сканером объектов: каждый раз, покончив с<br />
использованием/чтением/изучением чего-либо, я бы просто скидывал<br />
эту штуку в мусоросборник, а она волшебным образом перемещалась<br />
куда-нибудь и дожидалась там своего часа. Увы, похоже, подобные<br />
технологии не скоро до меня доберутся. Сейчас самая моя больная<br />
тема – музыкальная коллекция. Я, конечно, целиком за свободу творчества, но то, что все мои сборники CD имеют разные шрифты, цвета и<br />
формат хранения данных, действует на нервы. Впрочем, виртуальный<br />
мир вашей Linux-системы способен удовлетворить любые ваши прихоти, включая страсть к педантизму и скрупулезной правильности!<br />
<br />
Python – превосходный язык для выполнения стандартных операций с файлами. Он позволяет обрабатывать имена файлов и использовать функциональные возможности ОС с помощью ряда встроенных<br />
функций, всегда готов при необходимости вызвать внешние утилиты,<br />
имеет огромную коллекцию готовых модулей, способных выполнить<br />
практически любые действия, и к тому же очень прост для понимания.<br />
Он хорош не только для прототипирования, но и для создания самостоятельных приложений – или как минимум удобных небольших сценариев для выполнения частных задач.<br />
<br />
Итак, наша цель – разобраться с коллекцией музыкальных файлов<br />
на моем Linux-компьютере (отдельным счастливчикам это тоже при-<br />
годится). У меня есть один большой каталог под названием ‘Music’,<br />
который, как полагается, делится на подкаталоги по исполнителям,<br />
альбомам и отдельным трекам. Однако, несмотря на столь стройную<br />
систему, у меня имеются проблемы непосредственно с музыкальными<br />
файлами. Вот примерный список вещей, мешающих мне насладиться<br />
моей коллекцией:<br />
<br />
* Некоторые файлы имеют слишком длинные имена, затрудняющие работу с ними. Такое бывает с покупной музыкой: в название<br />
включается сразу и альбом, и имя исполнителя, и номер дорожки, и<br />
т.д. Я же хочу единый для всех названий вид, желательно без дурацких символов.<br />
* Некоторые файлы содержат тэги формата ID3v1, а не ID3v2. Беда<br />
небольшая, но по возможности я бы предпочел наслаждаться и преимуществами ID3v2.<br />
* Некоторые файлы снабжены тэгами формата ID3v2, но не ID3v1.<br />
Из-за этого они не читаются на стареньком MP3-плейере в моем<br />
автомобиле.<br />
* Некоторые из файлов неработоспособны. Неплохо было бы<br />
иметь список дефектных файлов, чтобы удалить их из коллекции<br />
или заменить.<br />
* Некоторые из файлов сохранены в нетипичных форматах, которые распознаются не всеми доступными устройствами. Список этих<br />
файлов тоже пригодился бы.<br />
<br />
Но как же достичь хотя бы части этих целей? Хоть я и не вполне уверен, что все перечисленные мной желания легко выполнимы, но попытаться стоит; по крайней мере, я знаю, с чего начать. В Python’е имеется<br />
модуль под названием os. Он реализует все стандартные функции ОС,<br />
в частности, связанные с файловой системой. Python – кросс-платформенная разработка, поэтому, несмотря на различия реализации в разных операционных системах, задача у данного модуля одна: предоставление функциональности уровня ОС с единым интерфейсом. Одной из<br />
самых полезных из известных мне функций, представленных в данном<br />
модуле, является walk(). Если задать ей имя родительского каталога,<br />
эта функция вернет список кортежей (см. врезку слева), включающих<br />
имя родительского каталога, список подкаталогов (если они есть) и<br />
список имен файлов. Таким образом, чтобы получить список всех файлов, включая полный путь к ним, нужно выполнить функцию walk() с<br />
заданным нами каталогом и по шагам обработать результат.<br />
<br />
==== Что такое «кортеж»? (врезка) ====<br />
Кортеж – это объект, состоящий из нескольких значений. Он часто<br />
используется в Python. Хороший пример использования кортежа –<br />
цвет. Вместо того, чтобы хранить три значения в трех разных переменных для красного, зеленого и синего цветов, вы назначаете одну переменную, содержащую три значения! Кортеж в Python записывается<br />
примерно так: (123,255,17). Вы можете получить доступ к любому элементу кортежа с помощью индексов – значений в квадратных скобках,<br />
указываемых после имени переменной. Например, команда print<br />
Colour[1] вернет значение «255» в случае с предыдущим примером –<br />
только не забывайте, что значения индексов начинаются с 0!<br />
<br />
=== Python и музон ===<br />
<code><br />
import os<br />
topdir=”/usr/share/music/”<br />
walklist = os.walk(topdir)<br />
for dirs in walklist:<br />
if(dirs[2]):<br />
for file in dirs[2]:<br />
// Выполнить какое-нибудь действие<br />
print os.path.join(dirs[0],file)<br />
else:<br />
for entry in dirs[1]:<br />
print dirs[1]<br />
</code><br />
<br />
В данном примере мы сначала импортируем модуль os, затем<br />
назначаем каталог, который хотим использовать. В результате выполнения функции walk() генерируется объект в переменной walklist. С<br />
помощью конструктора for мы можем затем использовать имеющийся в Python способ пошагового перемещения по списку для работы с<br />
каждым элементом. Чтобы вам стало понятнее, данные переменной<br />
walklist должны выглядеть примерно так:<br />
<br />
<code><br />
(‘/usr/share/music/Blonde_Redhead’, [‘1980 Forward’, ‘23’], [])<br />
(‘/usr/share/music/Blonde_RedHead/1980 Forward’, [], [‘18-Magic<br />
Mountain.mp3’])<br />
(‘/usr/share/music/Blonde_Redhead/23’, [], [‘10-My Impure Hair.<br />
mp3’,’1-23.mp3’, ‘7-Publisher.mp3’, ‘3-The Dress.mp3’, ‘6-Silently.<br />
mp3’])<br />
</code><br />
<br />
Теперь пошагово проверим каждую строку. Если элемент строки<br />
является файлом (одним или несколькими, в виде списка), мы хотим<br />
выполнить с ним определенные действия. Оператор if проверяет, имеется ли что-нибудь в каталоге, а если имеется, мы продолжим перемещаться по списку файлов тем же способом. Что делать с файлами,<br />
пока не совсем ясно, поэтому просто распечатаем список в стандартный вывод. Здесь мы воспользуемся другой полезной функцией модуля os – os.path.join(). Она соединяет вместе все компоненты пути к<br />
файлу и записывает их в виде, соответствующем текущему модулю os,<br />
что, несомненно, гораздо лучше, чем простое соединение вхождений с<br />
помощью слэша /, как это обычно делается в Linux!<br />
<br />
Я также добавил здесь еще одну ветку else – на случай, если мы<br />
захотим что-то проделать и с каталогами (может, переименовать?). Но<br />
для начала просто выполните данный скрипт, чтобы проверить, работает ли он в вашей системе. Главное – не забудьте указать именно<br />
тот каталог, где действительно имеются MP3-файлы.<br />
<br />
==== Проверка типов файлов ====<br />
Ну вот, теперь самое время добавить новые функции в данный скрипт.<br />
Но прежде чем приняться за файл, я предлагаю убедиться, что он действительно музыкальный! Думаю, мы можем смело предположить,<br />
что все MP3-файлы имеют расширение mp3. Таким образом, в нашем<br />
цикле мы могли бы проверить это и пометить файлы, не соответствующие данному критерию. Вероятно, мы могли бы просто включить<br />
такую проверку внутри цикла, уже осуществляемого оператором if, но<br />
так как проверка может потребоваться не одна, гораздо разумнее присвоить расширение переменной и затем проверять ее. Для извлечения<br />
расширения воспользуемся простым и мощным способом обработки<br />
строк и переменных других типов в Python (подробнее – см. врезку<br />
справа вверху). Добыв расширение файла, можно проверить, не совпадает ли оно с другими форматами музыкальных файлов, вроде ‘.wma’<br />
и ‘.ogg’ – на случай, если мы захотим поработать и с такими файлами.<br />
В Python нет оператора case:; придется нагромоздить последовательность операторов if, elif (else if) и else. Символ # в Python указывает, что<br />
оставшаяся часть строки – комментарий. В итоге наш основной цикл<br />
примет такой вид:<br />
<br />
<code><br />
for file in dirs[2]:<br />
fullpath = os.path.join(dirs[0],file)<br />
extension = file[-4:]<br />
if (extension!=’.mp3’):<br />
# Это не MP3-файл; проверить на другие расширения?<br />
if (extension ==’.wma’):<br />
wmalist.append(fullpath)<br />
elif (extension ==’.ogg’):<br />
ogglist.append(fullpath)<br />
else:<br />
unknownlist.append(fullpath)<br />
else:<br />
# Это MP3-файл.<br />
# Что-нибудь с ним сделаем.<br />
print fullpath<br />
</code><br />
<br />
Мы также должны объявить три переменных типа «список» в<br />
основном коде. Возможно, вы захотите добавить код, обрабатывающий файлы, или указать другие варианты расширений. Для полноты<br />
картины, создадим также список неизвестных типов файлов, найденных в нашем каталоге – чисто информативный; заодно он поможет<br />
обнаружить то, что мы упустили.<br />
Теперь займемся MP3-файлами. Спецификация ID3v1 весьма<br />
незамысловата: в конец файла просто добавляется 128 байт информации о файле, и легко создать синтаксический анализатор для сбора<br />
этих данных и дальнейшей обработки. Однако ID3v2 придерживается<br />
других стандартов: информация заносится в начало файла, в виде<br />
сложной структуры с переменной длиной данных, и, если честно, нам<br />
пришлось бы изрядно разрастить наш маленький скрипт, чтобы с ней<br />
справиться. Поэтому мы поступим, как все нормальные программисты:<br />
схитрим! Существует множество готовых модулей Python, способных<br />
читать данные MP3-тэгов, вот и возьмем один из них. Рекомендую<br />
EyeD3 – это признанный фаворит, и в нем есть все, что нам нужно. Вы<br />
найдете его на DVD, прилагаемом к данному журналу, а на сайте http://<br />
eyed3.nicfit.net может оказаться более свежая версия.<br />
Данный модуль творит всяческие чудеса; некоторые из них нам<br />
даже и трогать незачем. Вы можете почитать о нем подробнее на указанном сайте, но для наших целей достаточно импортировать модуль<br />
и ознакомиться с функциями, которые нам пригодятся.<br />
К счастью, модуль eyeD3 не относится к числу сложных. Опасения<br />
внушает только один объект – eyeD3.Tag, содержащий структуру тэгов<br />
ID3v1 и ID3v2. Чтобы заполнить его данными из вашего файла, вы<br />
должны использовать метод объекта link с соответствующим именем<br />
файла, и выглядит это примерно так:<br />
<br />
<code><br />
mytag=eyeD3.Tag()<br />
mytag.link(‘/usr/share/music/Blonde_Redhead/23/1-23.mp3’)<br />
print mytag.getArtist()<br />
print mytag.getAlbum()<br />
print mytag.getTrackNum()<br />
</code><br />
<br />
Изменив любой из тэгов, просто вызовите метод tag.update(), и<br />
он запишет новый тэг в файл. Теперь разберемся, как мы поступим с<br />
нашими файлами. Вместо того, чтобы сразу создавать необходимый<br />
код, я обычно просто вписываю набор операций, которые нужно сделать, в виде комментариев. Потом можно легко сортировать их, разбивать на более мелкие действия, или, в конце концов, собраться с духом<br />
и дописать требуемый код! Ниже представлен примерный список операций над нашими файлами, которые могли бы понадобиться:<br />
<br />
* Получить расширение файла<br />
* Он заканчивается на .mp3?<br />
* Проверить, действительно ли это MP3-файл<br />
* Прочитать тэги версии 2<br />
* Прочитать тэги версии 1<br />
* Если имеется только один тип, копировать в другой тип<br />
* Если тэгов вообще нет, установить пометку<br />
* Создать нормальное имя файла из тэгов<br />
* Предложить/записать новое имя файла<br />
* Проверить, соответствует ли название альбома имени каталога<br />
* Если это не MP3-файл, то что? Добавить в соответствующий список<br />
<br />
Как сказано выше, впишем это в скрипт в виде комментариев.<br />
Обычно приступать к делу лучше с первого пункта, чтобы от вас не<br />
ускользнули логика действий и структура скрипта. Особо хитрые участки – или участки, используемые многократно – можно вынести в<br />
отдельную функцию. Существуют мнения и за и против этого, и программисты нередко обсуждают, что допустимо выделять в отдельную<br />
функцию. Теория выглядит примерно так: чем больше вы выносите из<br />
основного цикла программы, тем более очевидной становится общая<br />
задача. Но есть и контрдовод: чем больше вы включаете подобных<br />
обобщений, делая программу максимально простой и понятной, тем<br />
сложнее потом добраться до работы отдельных функций. Резюме:<br />
поскольку вы пишете программу исключительно для личного пользования, делайте так, как вам удобнее!<br />
<br />
==== Проверка типов файлов – 2 ====<br />
Теперь пора и делом заняться. Прежде всего, получим расширения<br />
файлов через слайсинг Python’а, а затем проверим, MP3 это или нет.<br />
После чего употребим модуль eyeD3, чтобы распознать, действительно<br />
ли файл соответствует заявленному формату.<br />
<br />
После операторов проверки сделаем отступы, чтобы было видно,<br />
какой блок кода используется при обнаружении соответствия, и воз-<br />
вратимся к оператору else. В данном случае я слегка поменил порядок<br />
действий, для начала разобравшись с файлами, не соответствующими<br />
формату MP3, а затем через оператор else перешел к дальнейшим<br />
действиям. Почему? Да просто очень легко позабыть про файлы, не<br />
интересующие вас в данный момент; если вы можете парой строк отде-<br />
латься от второстепенных данных, лучше сразу с ними и покончить. В<br />
конечном итоге, быть может, у нас появится специальная функция для<br />
их обработки.<br />
<br />
В представленном ниже коде можно встретить так называемые<br />
функции «санации» (sanitize). Присутствие их тела в основном коде<br />
сделало бы его неудобочитаемым, кроме того, иногда их бывает нужно<br />
вызывать из разных мест. Наконец, так с их реализацией можно разо-<br />
браться и позже, не затрагивая основной код.<br />
<br />
<code><br />
if (extension !=’.mp3’):<br />
# Не файл MP3? Проверить на другие расширения?<br />
if (extension == ‘.wma’):<br />
wmalist.append(fullpath)<br />
# logger.warn(“silly wma file %s”,fullpath)<br />
elif (extension == ‘.ogg’):<br />
ogglist.append(fullpath)<br />
else:<br />
unknownlist.append(fullpath)<br />
else:<br />
# Это вправду MP3-файл?<br />
if eyeD3.isMp3File(fullpath):<br />
# Прочитать тэг ID3V2<br />
tag2 = eyeD3.Tag()<br />
tag1 = eyeD3.Tag()<br />
a = tag2.link(fullpath,eyeD3.ID3_V2)<br />
b = tag1.link(fullpath,eyeD3.ID3_V1)<br />
if b and not a:<br />
# Имеется только тэг ID3v1<br />
<br />
<br />
print “version1 only”<br />
# Создать информацию для tag2 по tag1<br />
print fullpath<br />
artist = tag1.getArtist()<br />
album = tag1.getAlbum()<br />
title = tag1.getTitle()<br />
print artist,album,title<br />
tag1.update(eyeD3.ID3_V2)<br />
# check tags are cool<br />
elif a and not b:<br />
# Имеется только тэг ID3v2<br />
print fullpath<br />
artist = tag2.getArtist()<br />
album = tag2.getAlbum()<br />
title = tag2.getTitle()<br />
print artist,album,title<br />
try:<br />
tag2.update(eyeD3.ID3_V1_1)<br />
except UnicodeEncodeError:<br />
logger.error(“tag invalid for v1.1 in file %s”,<br />
fullpath)<br />
elif a and b:<br />
# Имеются оба тэга<br />
logger.info( “both versions fine %s”, fullpath)<br />
else:<br />
# Тэгов нет вообще<br />
logger.warn(‘this file has no tags! %s’, fullpath)<br />
error_flag = True<br />
# М.б. удастся вытянуть что-нибудь из имени<br />
каталога, где сидит файл!<br />
if not error_flag:<br />
# Пускай имя файла будет<br />
# number-name.mp3<br />
title=tag2.getTitle()<br />
title = title.replace(‘ ‘,’_’)<br />
n=tag2.getTrackNum()<br />
# Номер (number) у нас есть<br />
ns = str(n[0])<br />
if len(ns)==1:<br />
ns= ‘0’+ns<br />
ns=ns+’-’+title+’.mp3’<br />
# Уберем нехорошие символы<br />
ns=sanitize(ns)<br />
if (file!=ns):<br />
logger.info(“change filename suggested for %s, to<br />
%s!”,filename,ns)<br />
os.rename(fullpath, os.path.join(dirs[0],ns)<br />
else:<br />
# Выдадим предупреждение<br />
logger.warn(“ file %s does not seem to be a valid mp3<br />
file”,fullpath)<br />
</code><br />
<br />
Полная распечатка этого небольшого скрипта представлена на<br />
DVD данного номера Linux Format. Но будьте осторожны – скрипт не<br />
завершен! Нельзя гарантировать, что он не испортит вашу музыкаль-<br />
ную коллекцию! Особенно следует обратить внимание на проверку<br />
символов в кодировке Unicode, нередко встречающихся в тэгах ID3v2<br />
(недопустимых в тэгах первой версии). Также вы, возможно, захотите<br />
обработать и файлы формата .ogg.<br />
<br />
Здесь не доделано также множество проверок на ошибки. В случае<br />
с тэгами в кодировке Unicode поможет структура try: ... except:; она же<br />
пригодится и для других случаев (например, выяснении, как поступать<br />
с музыкальными файлами без прав доступа на запись). Но я надеюсь,<br />
что рассмотренный в статье пример показал вам, как просто создавать<br />
полезные скрипты!<br />
<br />
==== Будем резать! (врезка) ====<br />
В Python используются индексы для «нарезания на кусочки» (иногда говорят «слайсинг»,<br />
от англ. slicing) строк, списков и других типов<br />
переменных. Пусть у нас имеется запись plop.<br />
mp3; мы можем запросто извлечь из нее<br />
любой нужный нам бит. Откройте терминал,<br />
запустите Python для входа в интерактивный<br />
режим и попробуйте следующие команды:<br />
<br />
<code><br />
>>> string = ‘plop.mp3’<br />
>>> print string[1]<br />
l<br />
>>> print string[:2]<br />
pl<br />
>>> print string [-0]<br />
p<br />
>>> print string [-1]<br />
3<br />
>>> print string [-4:]<br />
.mp3<br />
>>><br />
</code><br />
<br />
В последнем операторе print из строки выхватываются четыре последних символа.<br />
Отрицательные индексы отсчитываются с конца строки, но будьте внимательны: -0 означает<br />
<br />
==== Журналирование (врезка) ====<br />
Небольшие скрипты часто нашпиговывают множеством выводов промежуточных данных на<br />
печать, чтобы знать, что и как происходит. Это действительно удобно; но иногда хочется превратить строку с оператором печати в комментарий, потом снова её подключить, и т.д. Проще всего<br />
в таком случае использовать встроенный в Python модуль ведения журнала! Он умеет выводить<br />
сообщения и в консоль, но способен различать сообщения по значимости, и вы сможете гибко<br />
регулировать количество выводов на консоль путём правки всего одной строки кода скрипта.<br />
Добавьте этот модуль к списку импортируемых и впишите следующий код в начало вашего<br />
скрипта:<br />
<br />
<code><br />
logger = logging.getLogger(“pymusic”)<br />
# Создать обработчик консоли<br />
handler = logging.StreamHandler()<br />
# Создать форматирование и настроить обработчик на его использование<br />
formatter = logging.Formatter(“%(asctime)s - %(name)s - %(levelname)s - %(message)s”)<br />
handler.setFormatter(formatter)<br />
# Добавить обработчик к модулю ведения журнала<br />
logger.addHandler(handler)<br />
logger.setLevel(logging.WARN)<br />
</code><br />
Часть этих штук смахивает на волшебство, и кое-кто считает модуль ведения журнала непостижимым, но на самом деле все очень просто. Если вы хотите узнать больше, документация<br />
находится здесь: http://docs.python.org/lib/module-logging.html. Фактически, всё, что необходимо<br />
знать – это набор стандартных команд для управления выводом сообщений в консоль.<br />
Например, следующий код:<br />
<br />
<code><br />
logger.warn(“ file %s does not seem to be a valid mp3 file”,fullpath)<br />
</code><br />
<br />
выведет в консоль только сообщения, относящиеся к предупреждениям типа WARN или ниже<br />
(порядок такой: Critical, Error, Warning, Info, Debug). Можно установить и собственные уровни, но<br />
мы займёмся этим в другой раз...<br />
то же самое, что и просто 0, а именно – начало<br />
строки! (Индексы в Python нумеруются с 0.)<br />
<br />
==== Форматирование (врезка) ====<br />
Необходимость чёткого форматирования кода в Python многих ставит<br />
в тупик, но это вполне простое и разумное требование. В частности,<br />
отступы строк (посредством пробелов или табуляции) в блоке кода<br />
должны быть одинаковыми, потому что в Python отступы являются<br />
значимыми. Взглянув на код, вы не увидите фигурных скобок вокруг<br />
любых операторов или блоков кода: Python распознаёт окончание блока по окончанию отступа. Это даёт сразу два преимущества: код становится гораздо удобнее для чтения, и не надо заботиться о вложенных<br />
фигурных скобках!</div>OWeRQ