- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
import os
import codecs
from xml.dom import minidom
dir = 'C:\\Users\\pee\\AppData\\Roaming\\Thunderbird\\Profiles\\your_profile_here.default\\extensions'
target = 'install.rdf'
TB_id = '{3550f703-e582-4d05-9a08-453d09bdfdc6}'
maxVer = '5.*'
# open file, parse xml, find Thunderbird ID, change maxVersion, save file
def verchanger(rdf):
found = False
print(rdf)
xmldoc = minidom.parse(rdf)
idlist = xmldoc.getElementsByTagName("em:id")
for i in idlist:
if i._get_firstChild().nodeValue == TB_id:
print('Thunderbird ID was founded in em:id node with index ', idlist.index(i)+1)
print(i.parentNode.getElementsByTagName("em:maxVersion")[0]._get_firstChild().nodeValue)
if i.parentNode.getElementsByTagName("em:maxVersion")[0]._get_firstChild().nodeValue == maxVer:
print('file already updated, skipping')
break
else:
found = True
i.parentNode.getElementsByTagName("em:maxVersion")[0]._get_firstChild().nodeValue = maxVer
print('new value is: ', i.parentNode.getElementsByTagName("em:maxVersion")[0]._get_firstChild().nodeValue )
if found:
xmldoc.writexml(codecs.open(rdf,'w','utf-8'), encoding='utf-8')
# get list of files with full paths
filelist = [dir + '\\' + x + '\\' + target for x in os.listdir(dir)]
for i in filelist:
verchanger(i)
АЦИНИТИ КООТ!!!
вообще-то, предполагается, что автор понимает, в чем говно.
и что это не лаба.
я все жду, когда копирайт доберется и до Document Object Model, и появится ццшная имплементация freedom :)
За Python 3 — хвалю. ;)
Захардкоженные виндовые пути можно указывать как raw strings: r'C:\Users\pee\...'. А можно и прямые слеши вместо обратных использовать, винда не обидится.
Для построения пути следует использовать не конкатенацию с '\\', а os.path.join.
_get_firstChild — приватный метод, деталь реализации. Он доступен, но использование его считается плохим тоном. Следует использовать firstChild. На самом деле тут могут быть подводные камни.
Вместо idlist.index(i) следует использовать итерацию по enumerate или по индексу.
Вместо codecs.open можно использовать просто open и указывать encoding именованным параметром.
i.parentNode.getElementsByTagName("em:ma xVersion")[0] можно выделить в отдельную переменную.
Вместо громоздкого xml.dom.minidom лучше использовать xml.etree.ElementTree.
не прикармливай
1. Хардкод в топку. Даёшь аргументы командной строки.
2. Функции длиннее 5 строк навевают унылые мысли.
3. Основная ошибка всех новичков (да и не только новичков) - в одном блоке кода перемешивается несколько уровней абстракции.
или просто
?
В этом и состоит отличие скриптов, что в них внутри записаны параметры, которые проще изменить (если понадобится), отредактировав скрипт, чем вводить вручную каждый раз при запуске. Так что всё правильно сделал.
Лучше использовать с параметром и его значением по умолчанию, причем значение должно браться так: os.path.expanduser('~/AppData/Roaming/Thunderbird/Profiles')
а оттуда с помощью configparser из profiles.ini путь к дефолтному профилю.
по умолчанию программа должна думать сама.
Если уж делать автоопределение параметров и разбор командной строки, то следует ещё выделить отдельный модуль, написать документацию, маны, создать README, INSTALL, COPYING, AUTHORS, THANKS, ChangeLog, NEWS, TODO и запакетироать для дистрибьюции. Давайте, вперёд, не буду отговаривать.
скрипты пишут на bash, а на python пишут программы. я писал на питоне программы для автоматизации своих действий и прекрасно всегда пользовался батарейками для парсинга аргументов и вычисления нужных мне умолчаний.
вы виндовые свои привычки выкинули бы и начинали бы уже линуксом пользоваться, как нормальный человек, может быть тогда и говно перестали бы писать.
Эту батарейку очень недавно стали включать. И чем оно поможет?
а поможет оно чтобы не вспоминать а набрать script.py -h и увидеть все его возможные параметры
С прибытием в гвардию говнокодеров
Ц:\Пользователи\ссать