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

Напимер:

строка:
   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);
}
Искал что-то подобное в питоне.. Пока что поиски не увенчались успехом.
Надеюсь на вашу помощь.
Спасибо.
PooH
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 данные
doza_and
Могу предложить еще вариант
from struct import unpack
for str in open("data.dat","r"):
a,b,c,nl=unpack("3s3s3sc",str)
скелет тут ручной ближе к вашему перл коду
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB