Если вы хотите обработать свой собственный формат ввода, вам нужно сделать некоторые предположения.Для этого примера кода я предполагаю, что «h1» появляется между наборами из трех строк.Если это разрешено в середине, код должен немного отличаться.
Идея:
Написать функцию-генератор, которая перебирает текст и возвращает каждый полныйстрока в форме словаря.
Соберите их все
Когда вы отметили свой вопрос "pandas", переместите результат в кадр данных pandas
Вот рабочий пример.
import pandas as pd
example_text="""NameA
WorkplaceA
And a abstractA
NameB
WorkplaceB
And a abstractB
<h1>
NameC
WorkplaceC
And a abstractC"""
def next_name(mystr):
lines = iter(mystr.split('\n'))
while True:
n = {'NameCol':None,
'WorkplaceCol':None,
'AbstractCol':None
}
try:
n['NameCol'] = next(lines)
if n['NameCol'] == '<h1>':
continue
n['WorkplaceCol'] = next(lines)
if n['WorkplaceCol'] == '<h1>':
continue
n['AbstractCol'] = next(lines)
if n['AbstractCol'] == '<h1>':
continue
yield n
except StopIteration:
break
df = pd.DataFrame(next_name(example_text), columns=['NameCol','WorkplaceCol','AbstractCol'])
print(df)
Фрейм данных печатается как
NameCol WorkplaceCol AbstractCol
0 NameA WorkplaceA And a abstractA
1 NameB WorkplaceB And a abstractB
2 NameC WorkplaceC And a abstractC
Если вам нужно распечатать фрейм данных точно как ваш пример,Вот пример кода.
print(''.join(f'{x}\t' for x in df.columns))
print()
for row in df.iterrows():
print(''.join(f'{x}\t' for x in row[1]))
Вывод
NameCol WorkplaceCol AbstractCol
NameA WorkplaceA And a abstractA
NameB WorkplaceB And a abstractB
NameC WorkplaceC And a abstractC
Примечание: я использую Python 3.6, если вы используете более старую версию, вам нужно изменить команду печати.
Для сравнения, работа с пандами может выглядеть так (используя пример из кода выше)
df = pd.DataFrame(example_text.split('\n'))
df = df[df[0] != '<h1>'].reset_index().copy()
df['row'] = df.index // 3
result = df.groupby('row').agg(lambda x: list(x))[0].values
print('\t'.join(["NameCol", "WorkplaceCol", "AbstractCol"]))
print('')
print('\n'.join(['\t'.join(x) for x in result]))
, который выдает то же самое.
NameCol WorkplaceCol AbstractCol
NameA WorkplaceA And a abstractA
NameB WorkplaceB And a abstractB
NameC WorkplaceC And a abstractC