Как я могу получить этот конкретный формат данных в dataframe?

#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 вывод содержит пустую строку, как
и в вашем входном файле.