чтение данных из файла, смешивание строк и чисел в Python - PullRequest
1 голос
/ 05 июля 2010

Я хотел бы прочитать разные файлы в одном каталоге со следующей структурой:

#   Mj =  1.60      ff    =   7580.6    gg =  0.8325

Я хотел бы прочитать числа из каждого файла и связать каждый из них с вектором.Если предположить, что у меня есть 3 файла, у меня будет 3 компонента для вектора Mj, ... Как я могу сделать это в Python?

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 05 июля 2010

Я бы использовал регулярное выражение, чтобы разделить строку:

import re
lineRE = re.compile(r'''
    \#\s*
    Mj\s*=\s*(?P<Mj>[-+0-9eE.]+)\s*
    ff\s*=\s*(?P<ff>[-+0-9eE.]+)\s*
    gg\s*=\s*(?P<gg>[-+0-9eE.]+)
    ''', re.VERBOSE)

for filename in filenames:
    for line in file(filename, 'r'):
        m = lineRE.match(line)
        if not m:
            continue
        Mj = m.group('Mj')
        ff = m.group('ff')
        gg = m.group('gg')
        # Put them in whatever lists you want here.
0 голосов
/ 06 июля 2010

Вот решение для анализа, которое может быть проще в управлении, чем решение для регулярных выражений:

text = "#   Mj =  1.60      ff    =   7580.6    gg =  0.8325 "

from pyparsing import Word, nums, Literal

# subexpression for a real number, including conversion to float
realnum = Word(nums+"-+.E").setParseAction(lambda t:float(t[0]))

# overall expression for the full line of data
linepatt = (Literal("#") + "Mj" + "=" + realnum("Mj") +
            "ff" + "=" + realnum("ff") +
            "gg" + "=" + realnum("gg"))

# use '==' to test for matching line pattern
if text == linepatt:
    res = linepatt.parseString(text)

    # dump the matched tokens and all named results
    print res.dump()

    # access the Mj data field
    print res.Mj

    # use results names with string interpolation to print data fields
    print "%(Mj)f %(ff)f %(gg)f" % res

Печать:

['#', 'Mj', '=', 1.6000000000000001, 'ff', '=', 7580.6000000000004, 'gg', '=', 0.83250000000000002]
- Mj: 1.6
- ff: 7580.6
- gg: 0.8325
1.6
1.600000 7580.600000 0.832500
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...