Честно говоря, я не нахожу подход «анализ по столбцам» очень читабельным, и я ставлю под сомнение его удобство обслуживания (за исключением одной ошибки и т. П.).Хотя я уверен, что в этом случае понимание списка очень действенно и эффективно, и предлагаемое решение на основе zip имеет приятную функциональную настройку.
Вместо этого я собираюсь выбросить софтболы отсюдав левом поле, поскольку предполагается, что списочные выражения должны частично сделать ваш код более декларативным.Для чего-то совершенно другого, рассмотрим следующий подход, основанный на модуле pyparsing
:
def Fixed(chars, width):
return Word(chars, exact=width)
myDate = Combine(Fixed(nums,2) + Literal('-') + Fixed(alphas,3) + Literal('-')
+ Fixed(nums,4))
fullRow = Fixed(nums,2) + Fixed(nums,8) + Fixed(alphas,3) + Fixed(alphas,8)
+ myDate + myDate + ...
data = fullRow.parseString(s)
# should be ['41', '00100297', 'LIC', 'ACTIVE ',
# '09-JUN-1981', '31-DEC-2010', ...]
Чтобы сделать это еще более декларативным, вы могли бы назвать каждое из полей по мере их появления.Я понятия не имею, что на самом деле представляют собой поля, но что-то вроде:
someId = Fixed(nums,2)
someOtherId = Fixed(nums,8)
recordType = Fixed(alphas,3)
recordStatus = Fixed(alphas,8)
birthDate = myDate
issueDate = myDate
fullRow = someId + someOtherId + recordType + recordStatus
+ birthDate + issueDate + ...
Теперь такой подход, вероятно, не собирается побивать рекорды скорости на суше.Но, святая корова, тебе не будет легче читать и поддерживать?