Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 1, 2010 18:30:37

Hellb0y
От:
Зарегистрирован: 2010-11-01
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Пропарсить строку по позициям символов.

Есть несколько тхт файлов. Каждый файл представляет собой набор строк. Каждая строка представляет собой набор символов. Без разделителей, без чего либо еще. О структуре строки можно судить только изходя из документации с ее скелетом.

Напимер:

строка:

   7Петя      Иванов     СергеевичМоскваРоссия29779106619
И скелет (позиции соответсвующих полей):

Поле                    Позиция
ID [0-3]
Имя [4-7]
Фамилия [8-15]
Отчество [16-25]
Город [26-32]
Страна [33-40]
Возраст [41-42]
Телефон [43-49]
Т.е. о том, где заканчивается предыдущее слово, и где начинается следующее - можно понять только из скелета.
Таких файлов несколько. В каждом файле - свои данные (которых может не быть в другом файле) и у каждого файла свой скелет.

С помощью чего лучше всего сделать парсер таких файлов, чтобы строки разбивать на куски и запихивать в переменные.
Split тут точно не сработает. Вырезать для каждого файла срезы - как-то не то… Должно быть возможность проще…
Подскажите плз.

P.S. На Perl'e в свое время эту задачу решил с помощью побитового разбиения строки сразу при чтении.
Выглядело примерно так:

open DATA, $fileaddress;
while (read(DATA, $buf, 4+4+8+10+7+8+2+7)) {
($client_id, $firstname, $lastname, $midname, $city, $country, $age, $phone) = unpack($format_str, $buf);
}
Искал что-то подобное в питоне.. Пока что поиски не увенчались успехом.
Надеюсь на вашу помощь.
Спасибо.



Офлайн

#2 Ноя. 1, 2010 21:36:53

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Пропарсить строку по позициям символов.

import re

class DullReader:
scheme_str = re.compile(r'(?P<name>\w+)\s+\[(?P<start>\d+)-(?P<end>\d+)\]')

def __init__(self, scheme):
self.scheme =[]
for s in scheme:
match = self.scheme_str.match(s)
if match:
self.scheme.append((int(match.group('start')),int(match.group('end')), match.group('name')))

def read(self, f):
for s in f:
yield dict((x[2],s[x[0]:x[1]]) for x in self.scheme)


reader = DullReader('template.txt')
for x in reader.read('1.txt'):
print x
соответственно в template.txt скелет, в 1.txt данные



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Ноя. 6, 2010 21:02:01

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Пропарсить строку по позициям символов.

Могу предложить еще вариант

from struct import unpack
for str in open("data.dat","r"):
a,b,c,nl=unpack("3s3s3sc",str)
скелет тут ручной ближе к вашему перл коду



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version