Учитывая, что в данных много строк, которые вам не нужны, я думаю, что было бы лучше подготовить данные перед их загрузкой в фрейм данных.
На основе файла, частей информации, которые выПотребность всегда разделяется разделителем '-------...
, поэтому имеет смысл заглянуть в генератор для этих строк и загрузить только 2 строки перед разделителем.
Мы делаем это, беря первые 2 строкив качестве начала, а затем циклически просматривая файл, чтобы получить необходимую информацию.
from itertools import tee, islice, zip_longest
results = []
f = open('sample.txt','r')
n = 2 #number of lines to check
first = next(f)
delim = next(f)
results.append(first)
peek, lines = tee(f)
for idx, val in enumerate(lines):
if val == delim:
for val in islice(peek.__copy__(), idx - n, idx):
results.append(val)
last = idx
for i in islice(peek.__copy__(), last, last + 1):
results.append(i)
results
>> ['myserer143\n',
'Uninstallation has finished.\n',
'dbserer144\n',
'Uninstallation has finished.\n',
'dbserer144\n',
'Uninstallation has finished.']
На данный момент нет потерь памяти для загрузки неиспользуемых строк, и ваш возвращенный список содержит информацию, которую вынужно, установив смещения для первых нескольких строк и получив последнюю строку.
Затем вы можете сгруппировать результаты в пары для загрузки в кадр данных, используя рецепт Python из itertools
.
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
results = [i.strip() for i in results]
data = list(grouper(results, n))
df = pd.DataFrame(data, columns = ['Name','Status'])
df
>>
Name Status
0 myserer143 Uninstallation has finished.
1 dbserer144 Uninstallation has finished.
2 dbserer144 Uninstallation has finished.