Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 29, 2011 16:51:43

hippi90
От:
Зарегистрирован: 2011-04-06
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Непонятное поведение цикла и regexp

Помогите разобраться с непонятным поведением цикла. Попробовал парсить вывод ffmpeg при конвертации видео с помощью регулярного выражения. Он выдает большое количество информации о своих настройках, видеофайле и информацию о процессе конвертации (пример на pastebin: http://pastebin.com/YpgqEXtT)
Попробовал такой код:

f = open("log.v2n", "r")
strs = f.readlines()
i = 0
for str in strs:
i+=1
m = re.search("time=([0-9]*.[0-9]*)", str)
if m:
print(m.group(1))
print(i)
Цикл идет до первой строки вида:
frame=   38 fps=  0 q=2.0 size=      11kB time=1.52 bitrate=  57.2kbits/s
Выводит первое значение, затем прекращается. Если же из файла удалить весь предшествующий мусор, то цикл обработает все строки, сколько бы их не было. Откуда такое поведение?



Офлайн

#2 Апрель 29, 2011 17:26:03

Nik
От:
Зарегистрирован: 2010-01-10
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

Непонятное поведение цикла и regexp

1. Идентификатор str является специальным. Не стоит его переопределять!
2. Точка в регулярном выражении обозначает любой символ кроме \n. Его нужно экранировать.
3. Компилировать шаблон на каждой итерации цикла не есть хорошо.

import re
i = 0
p = re.compile(r"time=([0-9]+\.[0-9]+)")
for line in open("log.v2n", "r"):
i+=1
m = p.search(line)
if m:
print(m.group(1))
print(i)



Офлайн

#3 Апрель 29, 2011 18:45:22

hippi90
От:
Зарегистрирован: 2011-04-06
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Непонятное поведение цикла и regexp

Nik
1. Идентификатор str является специальным. Не стоит его переопределять!
2. Точка в регулярном выражении обозначает любой символ кроме \n. Его нужно экранировать.
3. Компилировать шаблон на каждой итерации цикла не есть хорошо.

import re
i = 0
p = re.compile(r"time=([0-9]+\.[0-9]+)")
for line in open("log.v2n", "r"):
i+=1
m = p.search(line)
if m:
print(m.group(1))
print(i)
Странно, под Windows код работает как надо, а в Linux так же, как и в моем случае, только первое значение выводится.



Офлайн

#4 Апрель 29, 2011 19:36:52

Nik
От:
Зарегистрирован: 2010-01-10
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

Непонятное поведение цикла и regexp

Python 3 ? Тогда укажите кодировку файла в функции open(). В Windows кодировка по умолчанию скорее всего cp1251, а в Linux скорее всего UTF-8. Отсюда проблемы.

for line in open("log.v2n", "r", encoding="cp1251", errors="ignore"):
Или открывайте файл в бинарном режиме.



Офлайн

#5 Апрель 29, 2011 20:43:29

hippi90
От:
Зарегистрирован: 2011-04-06
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Непонятное поведение цикла и regexp

Упс, моя ошибка, в Linux по недосмотру запускал скрипт на Python 2, после замены на Python 3 заработало. Кстати, а разве Python 3 по-умолчанию не использует Unicode?



Офлайн

#6 Апрель 29, 2011 20:49:27

Nik
От:
Зарегистрирован: 2010-01-10
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

Непонятное поведение цикла и regexp

Кстати, а разве Python 3 по-умолчанию не использует Unicode?
Использует. Но данные из файла нужно преобразовать в Unicode. Для этого нужно знать кодировку файла. Кодировка файла по умолчанию соответствует кодировке в системе. В Windows и Linux кодировки системы разные. Чтобы работало везде одинаково следует указать кодировку файла явным образом.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version