Python — Разделение данных из текстового файла с использованием разделителя

#python #pandas #delimiter

#python #pandas #разделитель

Вопрос:

Я пытаюсь прочитать набор текстовых файлов и сохранить их в Dataframe. Благодаря @jezrael мне удалось заставить это работать, как показано ниже:

 list_ = []
dfs = []
for file_ in allFiles:
    with open(file_) as fp:
        lines1 = fp.read().split('n')
        b = [i.split('~', 1)[1].split('*') for i in lines1]
        df = pd.DataFrame(b)
        dfs.append(df)

dfbig = pd.concat(dfs, ignore_index=True)
dfbig.to_csv('file.csv')
  

Однако я вижу, что есть несколько строк, в которых есть несколько записей ('~') , и, следовательно, каждый раз, когда ('~') встречается более одного раза подряд, он просто выполняет разделение один раз. Я пытаюсь понять, как я мог бы изменить приведенный выше код таким образом, чтобы разделение происходило каждый раз, когда ('~') появляется.

Пример данных:

 [ABC*DEF*123>~123*999*HHH~HELLO*TEST*DATA]
  

Ожидаемый результат:

 123 999 HHH
HELLO TEST DATA
  

Комментарии:

1. @jezrael, продолжая наш предыдущий вопрос. Спасибо..

2. Можете ли вы добавить несколько примеров данных?

3. лучше всего с некоторыми проблемными строками.

4. Я думаю, что регулярное выражение сработало бы здесь лучше

5. Можете ли вы предоставить пример вывода?

Ответ №1:

Вы можете изменить:

 b = [i.split('~', 1)[1].split('*') for i in lines1]
  

для понимания списка с выравниванием и разделением по всем ~ значениям с отфильтровыванием первого значения:

 b = [x.split('*') for i in lines1 for x in i.split('~')[1:]]
  

Проверка:

 lines1 = ['ABC*DEF*123>~123*999*HHH~HELLO*TEST*DATA']
b = [x.split('*') for i in lines1 for x in i.split('~')[1:]]
print (b)
[['123', '999', 'HHH'], ['HELLO', 'TEST', 'DATA']]
  

Тогда решение должно быть изменено с помощью extend :

 list_ = []

allFiles = glob.glob('csv/*.*')
for file_ in allFiles:
    with open(file_) as fp:
        lines1 = fp.read().split('n')
        b = [x.split('*') for i in lines1 for x in i.split('~')[1:]]
        list_.extend(b)

dfbig = pd.DataFrame(list_)