Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 9, 2009 17:29:09

Mottle
От:
Зарегистрирован: 2009-03-13
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматное чтение из файла

Доброе время суток!

Подскажите, пожалуйста, как прочитать из файла по формату?

В Fortran'е это выглядит так:

open(30,file=FileName)
read(30,100) a,b,(c(j),d(j),j=1,5),e,f,g
close(30)

100 Format(I2,1X,A6,1X,5(A2,F6.2),1X,I1,2F13.5)
Пытался делать так:
f=open(FileName,'r')
aaa=f.readline()
f.close()

a=aaa[0:2]
b=aaa[3:9]
.
.
.
Но, по-моему, как-то не спортивно получается…



Офлайн

#2 Окт. 10, 2009 00:38:11

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматное чтение из файла

</НЕНАВИСТЬ-НЕНАВИСТЬ-НЕНАВИСТЬ>
НЕНАВИЖУ ФОРТРАНОВСКИЙ ФОРМАТНЫЙ ВВОД
</НЕНАВИСТЬ-НЕНАВИСТЬ-НЕНАВИСТЬ>

Объясните что конкретно надо. Ну тоесть как выглядит формат, что по сколько знаков читать, а то фортрановский код непонятен.

Просто если между цифрами гарантировано остаются промежутки, то лучше использовать “строка”.split() и так и брать переменные из полученого списка. Если промежутков нет - тогда уже как не крути а придётся разбирать ручками, особенно если в одной строке форматы разные.



Офлайн

#3 Окт. 10, 2009 02:45:30

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Форматное чтение из файла

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



Офлайн

#4 Окт. 10, 2009 12:39:21

Mottle
От:
Зарегистрирован: 2009-03-13
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматное чтение из файла

Прощу прощения.
Попробую еще раз.

Строка выглядит так:
двузначное целое число, пробел, строка из щести символов, пробел, далее подряд пять раз строка из двух символов, шестизначное вещественное число, пробел.

12 аа ааа бб 12.456 вв 00.000 гг 00.000 дд 00.000 ее 00.000

Использование “строка”.split() не подходит так как в подстроке, которая должна быть прочитана в одну переменную могут встречаться пробелы.



Офлайн

#5 Окт. 10, 2009 14:07:07

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Форматное чтение из файла

в C тоже есть функция форматированного чтения из строки: sscanf :)
пример использования есть в учебнике ctypes: http://python.net/crew/theller/ctypes/tutorial.html,
еще есть модуль scanf (http://hkn.eecs.berkeley.edu/~dyoo/python/scanf/), но его придется обработать напильником, чтобы работал с кирилицей, ну и еще можно почитать документацию по Python'у (для python 2.6 это пункт 8.2.6.2. Simulating scanf())



Офлайн

#6 Окт. 10, 2009 14:18:56

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматное чтение из файла

Понятно.
Позже попробую найти свои старые модули.

В общем идея такая:
Чтоб не разбирать руками, я делал файл-шаблон и разбирал уже по инструкциям из него.

Для вашего случая например, первая строка будет выглядеть примерно так:

2i 6s 2s 7f 2s 7f 2s 7f 2s 7f 2s 7f
А потом цикл который отмеряет куски строки и определяет тип переменной (str, int, float) по этому шаблону, результат собирается в список.
Если файлов с разным форматом много, то это намного проще чем задавать всё вручную.

Добавлено позже:
Сканф конечно лучше :)

Добавлено ещё позже:
Хотя по-моему он воспринимает пробел как разделитель.



Отредактировано (Окт. 10, 2009 14:31:52)

Офлайн

#7 Окт. 10, 2009 15:19:45

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

Форматное чтение из файла

Можно регуляркой разбирать, а регулярку строить по форматной строке



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

Офлайн

#8 Окт. 10, 2009 16:02:56

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматное чтение из файла

PooH
Можно регуляркой разбирать, а регулярку строить по форматной строке
Красивее конечно получится, но с циклом “шагами” проще локализовать место ошибки.

Этот фортрановский формат, же редкая зараза, особенно если без пробелов - один символ сместился и всё, тю-тю…



Офлайн

#9 Окт. 11, 2009 00:08:32

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Форматное чтение из файла

он(PooH) предлогает отрабатывать регулярными вырожениями, это вполне нормальный способ , и найти и отладить ошибку особо не представляется сложным

Офлайн

#10 Окт. 11, 2009 01:07:19

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Форматное чтение из файла

Я вот так реализовал бы:

def get_long_format(short_format_list):
short_format_list = list(short_format_list)
result = []
while short_format_list:
e = short_format_list.pop(0)
if isinstance(e, (tuple, list)):
buf = list(e[:-1] * e[-1])
buf.extend(short_format_list)
short_format_list = buf
else:
rep = {"s":str, "f":float, "i":int}
result += [(int(e[:-1]), rep[e[-1]])]
return result

def get_by_format(s, long_format):
result = []
i = 0
for k, f in long_format:
result.append(f(s[i:i+k]))
i += k + 1
return result

>> sformat = ("2i", "6s", ("2s", "6f", 4), "2s", "6s")
>> lformat = get_long_format(sformat)
>> lformat
[(2, <class 'int'>), (6, <class 'str'>), (2, <class 'str'>), (6, <class 'float'>), (2, <class 'str'>), (6, <class 'float'>), (2, <class 'str'>), (6, <class 'float'>), (2, <class 'str'>), (6, <class 'float'>), (2, <class 'str'>), (6, <class 'str'>)]

>> s = "12 аа ааа бб 12.456 вв 00.000 гг 00.000 дд 00.000 ее 00.000"
>> get_by_format(s, lformat)
[12, 'аа ааа', 'бб', 12.456, 'вв', 0.0, 'гг', 0.0, 'дд', 0.0, 'ее', '00.000']
Разбил что бы промежуточный результат было видно.

Интересно увидеть регуляркой.



Отредактировано (Окт. 11, 2009 01:33:01)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version