#python #pandas
#python #pandas
Вопрос:
У меня есть текстовый файл в этом формате
====================
Something Something Something
====================
Something Something Something
====================
Something Something Something
====================
Something Something Something
Something Something Something
Something Something Something
====================
Something Something Something
Something Something Something
Something Something Something
====================
Something Something Something
====================
Something Something Something
====================
Something Something Something
====================
Как я пытаюсь проиллюстрировать, есть несколько новых строк, несколько пустых строк, но определяющей особенностью является то, что содержимое, которое я пытаюсь захватить, всегда находится между строками со знаками равенства.
Я пробовал .read_csv, но это не работает, потому что значение ячеек в фреймах данных должно отображать весь текст, включая новые строки.
В частности,
df = pd.read_csv(x "/" file, sep="====================", names=["Content"], engine="python", index_col=False)
Затем мой желаемый фрейм данных выглядит так
Content
0 Something Something Something
1 Something Something Somethingn nSomething Something SomethingnSomething Something Something
Например.
Кто-нибудь знает, как я могу этого добиться?
Ответ №1:
Сначала определите пользовательский класс чтения файлов:
class InFile:
def __init__(self, infile):
self.infile = open(infile)
def __iter__(self):
return self
def read(self, *args, **kwargs):
res = ''
while True:
line = self.infile.readline()
if not line:
self.infile.close()
return line
if line[:4] == '====':
if len(res) > 0:
break
else:
res = line
return res
Затем преобразуйте ваш входной файл в список строк (некоторые из них представляют
собой многострочные строки):
ff = InFile('Input.txt')
tbl = []
while True:
tt = ff.read()
if not tt: break
tbl.append(tt.strip())
И последний шаг — создать DataFrame из этого списка:
df = pd.DataFrame({'Content': tbl})
К сожалению, если вы попытаетесь просто print(df)
, Pandas напечатает это
Фрейм данных с текстовым представлением каждого n
,
и вся (возможно, многострочная) строка в любом случае занимает одну строку.
Таким образом, лучший способ проверить, что было прочитано, — это запустить пользовательский цикл, печатающий индекс и поле содержимого из каждой строки:
for idx, row in df.iterrows():
print(f' Idx: {idx}')
print(row.Content)
Для вашего образца данных, с последовательным номером, вставленным после каждого
Что-то, результат:
Idx: 0
Something1 Something Something
Idx: 1
Something2 Something Something
Idx: 2
Something3 Something Something
Idx: 3
Something4 Something Something
Something5 Something Something
Something6 Something Something
Idx: 4
Something7 Something Something
Something8 Something Something
Something9 Something Something
Idx: 5
Something10 Something Something
Idx: 6
Something11 Something Something
Idx: 7
Something12 Something Something
Обратите внимание, что после Something7 вывод содержит пустую строку, как
и в вашем входном файле.