Найти - Пользователи
Полная версия: Генерация списка словарей из текстового файла
Начало » Python для новичков » Генерация списка словарей из текстового файла
1 2 3 4 5 6 7 8
metotron
блин. мой косяк - файл изначально txt - я просто взял часть и пересохранил, исходник пару тысяч строк имеет и когда сохранял не проверил
Перезалил файл
py.user.next
Там \r\n на концах строк, но при чтении они должны преобразоваться в \n.
Выполни
repr(open('somefile.txt').read())
и посмотри, есть ли там \r.

Там они вообще как бы в перемешку идут. Первая строка нормальная - \n, вторая - \r\n. Возможно, когда они вперемешку, он их не преобразует. Надо поправить файл либо на одни \n, либо на одни \r\n.
metotron
вообщем выходит цветок из данилы-мастера но шипами наружу
я удалил /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)

Спасибо!
metotron
причем самое что странное - результат то он печатает сек через 10 (что так же много) а остальное время тупо “висит”
Originator
Я извиняюсь что встрял. Я большинство программного кода написанного вами не понимаю еще. Но почитываю для общего развития и иные ветки форума. Мне попадалось пару раз про IDE, полезная штука как - отладчик. Насколько я могу судить из своих познаний, там в некоторых IDE (том же PySharm) отличный отладчик, и есть фишка показывающая время action (исполнения) операции. Я этим не пользовался, не умею еще и рано мне, но я предполагаю , что можно пошагово прогонять программу и смотреть на результаты и анализ. Может это поможет определить “узкое” место вашего кода, где падает скорость (цикл, чтение и подобное).
Если написал бред - прошу просто проигнорировать, но критика приветствуется.
py.user.next
metotron
Файл объемом в 500кВ парсится секунд 45
Выполни там
re.findall(pat, s)
input('end')

Если долго, можно re.finditer() применить.
metotron
хм…. удалил принт листа и все вдруг стало работать быстро - с чего это вдруг print так влияет
Shaman
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"
Для более строгого следования формату.
py.user.next
Shaman
И не нужно никаких замен переводов строк.
Надо файл привести к нормальному виду, он явно там неправильно создан чем-то.
Shaman
Если данные будут разбираться не единожды, лучше учесть все случаи чем каждый раз заморачиваться с приведением к нормальному виду.
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