Найти - Пользователи
Полная версия: Непонятное поведение цикла и regexp
Начало » Python для новичков » Непонятное поведение цикла и regexp
1
hippi90
Помогите разобраться с непонятным поведением цикла. Попробовал парсить вывод 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
Выводит первое значение, затем прекращается. Если же из файла удалить весь предшествующий мусор, то цикл обработает все строки, сколько бы их не было. Откуда такое поведение?
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)
hippi90
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 так же, как и в моем случае, только первое значение выводится.
Nik
Python 3 ? Тогда укажите кодировку файла в функции open(). В Windows кодировка по умолчанию скорее всего cp1251, а в Linux скорее всего UTF-8. Отсюда проблемы.
for line in open("log.v2n", "r", encoding="cp1251", errors="ignore"):
Или открывайте файл в бинарном режиме.
hippi90
Упс, моя ошибка, в Linux по недосмотру запускал скрипт на Python 2, после замены на Python 3 заработало. Кстати, а разве Python 3 по-умолчанию не использует Unicode?
Nik
Кстати, а разве Python 3 по-умолчанию не использует Unicode?
Использует. Но данные из файла нужно преобразовать в Unicode. Для этого нужно знать кодировку файла. Кодировка файла по умолчанию соответствует кодировке в системе. В Windows и Linux кодировки системы разные. Чтобы работало везде одинаково следует указать кодировку файла явным образом.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB