Прочитать текстовый файл с заданным разделением структуры с помощью Python - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь прочитать текстовый файл, содержащий несколько полей, структурированных с заданным количеством символов в каждом. Я знаю, что первое поле занимает n1 символов, второе поле n2 символа, ...

Это то, что у меня пока есть, для одной строки:

# Line
line = 'AAABBCCCCDDDDDE'

# Array structure
slice_structure  = [3,2,4,5,1]

sliced_array = []
cursor = 0
for n in slice_structure :
    sliced_array.append(line[cursor:cursor+n])
    cursor += n

print(sliced_array)

Ответ следующий:

['AAA', 'BB', 'CCCC', 'DDDDD', 'E']

Я собираюсь создать функцию с этим кодом и вызывать ее для каждой строки файла. Я уверен, что должен быть лучший способ сделать это.

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 15 октября 2019

Вы можете использовать groupby для каждой строки, которую вы читаете из этого файла:

from itertools import groupby

line = 'AAABBCCCCDDDDDE'

result = ["".join(list(g)) for k, g in groupby(line)]

print(result)

Результат:

['AAA', 'BB', 'CCCC', 'DDDDD', 'E']
1 голос
/ 15 октября 2019

Вы можете сделать это, используя следующие два метода.

Method-1 :
Использует list.insert для размещения некоторых разделителей ('|'), а затем разделяет строку, используя эти разделители.

Метод-2 :
Используется понимание списка.

import numpy as np

# Line
line = 'AAABBCCCCDDDDDE'
# Array structure
slice_structure  = [3,2,4,5,1]
ss = np.array(slice_structure).cumsum()

# Method-1
# >> Uses list.insert to place some separators ('|')
#    and then split the string using these separators.
l = list(line)
for p in np.flip(ss[:-1]):
    l.insert(p,'|')
final_1 = ''.join(l).split('|')
print('Method-1: {}'.format(final_1))

# Method-2
# >> Uses list comprehension
stop_pos = ss.tolist()
start_pos = [0] + ss[:-1].tolist()
final_2 = [line[start:stop] for start, stop in zip(start_pos, stop_pos)]
print('Method-2: {}'.format(final_2))

Вывод :

Method-1: ['AAA', 'BB', 'CCCC', 'DDDDD', 'E']
Method-2: ['AAA', 'BB', 'CCCC', 'DDDDD', 'E']
1 голос
/ 15 октября 2019

Если ваши имена полей на самом деле являются текстовыми (а не повторяющимися символами), и вы хотите разделить вашу строку по значениям в списке слайсов, вот простой / читабельный подход:

# Line
line = 'AAABBCCCCDDDDDE'
# Array structure
slice_structure  = [3,2,4,5,1]
# Results list
result = []

for i in slice_structure:
    result.append(line[:i])
    line = line[i:]

print(result)

Вывод:

['AAA', 'BB', 'CCCC', 'DDDDD', 'E']
1 голос
/ 15 октября 2019

Вопрос : распаковать поля записи, структурированные с заданным количеством символов в каждом.

from struct import unpack

record = 'AAABBCCCCDDDDDE'

fields = [item.decode() for item in 
          unpack('3s2s4s5s1s', bytes(record, 'utf-8'))]

print(fields)
>>> ['AAA', 'BB', 'CCCC', 'DDDDD', 'E']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...