#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_)