Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 26, 2011 20:14:55

aivs
От:
Зарегистрирован: 2011-05-26
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

Хотел подробное описание регэкспа, не знаю что такое %s. А ладно сам разберусь!



Офлайн

#2 Окт. 26, 2011 20:38:52

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

%s - это не регексп, это старый не модный string formatting: http://docs.python.org/release/2.5/lib/typesseq-strings.html
модный здесь: http://docs.python.org/library/string.html#format-string-syntax



Офлайн

#3 Окт. 27, 2011 17:15:34

aivs
От:
Зарегистрирован: 2011-05-26
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

Спасибо, учу re!
методы строк работают быстрее, чем re



Отредактировано (Окт. 28, 2011 10:23:35)

Офлайн

#4 Окт. 28, 2011 12:12:58

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

Если хотите быстрее, то читайте построчно и в каждой строке меняйте то, что нужно. Только не readlines, пожалуйста.



Офлайн

#5 Окт. 28, 2011 23:22:36

aivs
От:
Зарегистрирован: 2011-05-26
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

Как читать построчно, если не readlines? написать свою функцию, которая по \n будет определять где конец строки? Когда С изучал, там предлагался именно такой метод.

Я обдумывал такой вариант парсинга конфига, без использования re:
1) Прочитать все строки с помощью readlines
2) каждую строку преврать в list из слов с помощью split
3) Сравнить первое слова с шаблоном
4) если первое слово совпадает с шаблоном, то работать уже с этой строкой
5) после изменения, собрать обратно list в строку c помощью join
6) записать в файл

Думаю, что операции split/join по времени будут выполняться так же как и конструкция для re.

Прощу прощения за демогогию, если это не разумно, и для такой простой задачи лучше использовать re, то я закончу эту дискуссию!



Офлайн

#6 Окт. 29, 2011 00:48:34

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

readlines читает весь файл. Конечно для вашего случая это неважно, но и не нужно. Если же файл большой, то это уже ненужный расход памяти.
Вам по идее достаточно прочитать строку, заменить в ней чего надо если надо и записать ее в выходной файл.
В конце процесса переименовать выходной файл во входной.

Читать по строкам так:

for line in open(filename):
print line



Офлайн

#7 Окт. 29, 2011 10:13:21

aivs
От:
Зарегистрирован: 2011-05-26
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

Спасибо, попробую



Офлайн

#8 Окт. 29, 2011 12:16:33

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

Если есть желание - давайте результат сюда, посмотрим, подправим.



Офлайн

#9 Окт. 29, 2011 14:54:29

aivs
От:
Зарегистрирован: 2011-05-26
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

Результат конечно напишу!
for line in open(filename) это не тоже самое что и readline? Построчное чтение, гораздо медленее чем readlines.



Офлайн

#10 Окт. 29, 2011 21:04:16

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

может быть и медленнее. Напишите оба варианта и попрофилируем. Если вам так важно быстродействие, то выберете самый быстрый. Хотя для админских задач быстродействие на мой взгляд некритично. Впрочем если вы будете апдейтить десятки тысяч конфигов таким образом, то да.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version