Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 21, 2015 01:13:13

metotron
Зарегистрирован: 2015-08-20
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

блин. мой косяк - файл изначально txt - я просто взял часть и пересохранил, исходник пару тысяч строк имеет и когда сохранял не проверил
Перезалил файл

Прикреплённый файлы:
attachment info.txt (559 байт)

Офлайн

#2 Авг. 21, 2015 14:20:14

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

Там \r\n на концах строк, но при чтении они должны преобразоваться в \n.
Выполни

repr(open('somefile.txt').read())
и посмотри, есть ли там \r.

Там они вообще как бы в перемешку идут. Первая строка нормальная - \n, вторая - \r\n. Возможно, когда они вперемешку, он их не преобразует. Надо поправить файл либо на одни \n, либо на одни \r\n.



Отредактировано py.user.next (Авг. 21, 2015 14:21:58)

Офлайн

#3 Авг. 21, 2015 20:51:37

metotron
Зарегистрирован: 2015-08-20
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

вообщем выходит цветок из данилы-мастера но шипами наружу
я удалил /r и заменил /n/n на /n (это встречалось в конце каждого блока) - все равно пустой лист создается
Тогда я попробовал скопировать кусок текста прямо в код и поиграть с паттерном - получилось что он очень воспреимчив к отступам от края. Я сделал вариант когда текст имеет отступ и вариант когда он его не иммет. (открываю америку сейчас) и получилость что необходимо или иметь отступ или не иметь его и аналогично подстроить паттерн

И все взлетело - но ну очень медленно. Файл объемом в 500кВ парсится секунд 45 (машина 16гб и проц i7)
может быть есть ли какой-либо способ драматически ускориться? Я привожу финанльный код ниже

import re
pat = r"""
MemTotal: +(\d+) kB
MemFree: +(\d+) kB
Buffers: +(\d+) kB"""
def myRead():
    with open ("somefile.txt", "r") as myfile:
        data=myfile.read()
        data = re.sub('\r','',data)
        data = re.sub('\n\n','\n',data)
    return data
s = myRead()
lst = []
for i in re.findall(pat, s):
    s = [int(x) for x in i]
    lst.append(dict(zip(('total', 'free', 'buffers'),s)));
print(lst)

Спасибо!

Офлайн

#4 Авг. 21, 2015 20:57:30

metotron
Зарегистрирован: 2015-08-20
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

причем самое что странное - результат то он печатает сек через 10 (что так же много) а остальное время тупо “висит”

Офлайн

#5 Авг. 21, 2015 22:28:33

Originator
От: Харьков, Украина
Зарегистрирован: 2015-08-01
Сообщения: 29
Репутация: +  1  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

Я извиняюсь что встрял. Я большинство программного кода написанного вами не понимаю еще. Но почитываю для общего развития и иные ветки форума. Мне попадалось пару раз про IDE, полезная штука как - отладчик. Насколько я могу судить из своих познаний, там в некоторых IDE (том же PySharm) отличный отладчик, и есть фишка показывающая время action (исполнения) операции. Я этим не пользовался, не умею еще и рано мне, но я предполагаю , что можно пошагово прогонять программу и смотреть на результаты и анализ. Может это поможет определить “узкое” место вашего кода, где падает скорость (цикл, чтение и подобное).
Если написал бред - прошу просто проигнорировать, но критика приветствуется.

Офлайн

#6 Авг. 22, 2015 02:26:00

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

metotron
Файл объемом в 500кВ парсится секунд 45
Выполни там
re.findall(pat, s)
input('end')

Если долго, можно re.finditer() применить.



Офлайн

#7 Авг. 22, 2015 03:21:45

metotron
Зарегистрирован: 2015-08-20
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

хм…. удалил принт листа и все вдруг стало работать быстро - с чего это вдруг print так влияет

Отредактировано metotron (Авг. 22, 2015 03:25:55)

Офлайн

#8 Авг. 22, 2015 08:45:58

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

pat = r"MemTotal:\s+(\d+)\s+kB\s+MemFree:\s+(\d+)\s+kB\s+Buffers:\s+(\d+)\s+kB"
И не нужно никаких замен переводов строк.
Или вот так
pat = r"MemTotal:\s+(\d+)\s+kB\s*[\r\n]+MemFree:\s+(\d+)\s+kB\s*[\r\n]+Buffers:\s+(\d+)\s+kB"
Для более строгого следования формату.

Отредактировано Shaman (Авг. 22, 2015 09:13:17)

Офлайн

#9 Авг. 22, 2015 09:52:55

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

Shaman
И не нужно никаких замен переводов строк.
Надо файл привести к нормальному виду, он явно там неправильно создан чем-то.



Отредактировано py.user.next (Авг. 22, 2015 09:53:04)

Офлайн

#10 Авг. 22, 2015 10:03:36

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

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

Отредактировано Shaman (Авг. 22, 2015 21:01:09)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version