Извлечение данных из текстового файла для использования в скрипте Python? - PullRequest
0 голосов
/ 16 мая 2010

По сути, у меня есть такой файл:

Url/Host:   www.example.com
Login:     user
Password:   password
Data_I_Dont_Need:    something_else

Как я могу использовать RegEx, чтобы разделить детали, чтобы поместить их в переменные?

Извините, если это ужасный вопрос, я просто не могу понять RegEx. Итак, еще один вопрос, можете ли вы предоставить RegEx, но объясните, для чего каждая его часть?

Ответы [ 5 ]

1 голос
/ 16 мая 2010

Для такого простого файла вам не нужны регулярные выражения. Строковые функции, вероятно, легче понять. Этот код:

def parse(data):
    parsed = {}    
    for line in data.split('\n'):
        if not line: continue # Blank line
        pair = line.split(':')
        parsed[pair[0].strip()] = pair[1].strip()
    return parsed

if __name__ == '__main__':
    test = """Url/Host:   www.example.com
    Login:     user
    Password:   password
"""
    print parse(test)

сделает работу, и в результате:

{'Login': 'user', 'Password': 'password', 'Url/Host': 'www.example.com'}
1 голос
/ 16 мая 2010

Вы должны поместить записи в словарь, а не в такое количество отдельных переменных - ясно, что используемые вами ключи должны НЕ быть приемлемыми в качестве имен переменных (с косой чертой в «Url / Host»). может быть убийцей! -), но они будут просто хороши как строковые ключи в словаре.

import re

there = re.compile(r'''(?x)      # verbose flag: allows comments & whitespace
                       ^         # anchor to the start
                       ([^:]+)   # group with 1+ non-colons, the key
                       :\s*      # colon, then arbitrary whitespace
                       (.*)      # group everything that follows
                       $         # anchor to the end
                    ''')

, а затем

 configdict = {}
 for aline in open('thefile.txt'):
   mo = there.match(aline)
   if not mo:
     print("Skipping invalid line %r" % aline)
     continue
   k, v = mo.groups()
   configdict[k] = v

возможность сделать шаблоны RE "многословными" (начав их с (?x) или используя re.VERBOSE в качестве второго аргумента re.compile), очень полезна для того, чтобы вы могли уточнить свои RE с помощью комментариев и приятного выравнивания пробельные. Я думаю, что он, к сожалению, недостаточно используется; -).

0 голосов
/ 17 мая 2010

ConfigParser модуль поддерживает ':' разделитель.

import ConfigParser
from cStringIO import StringIO

class Parser(ConfigParser.RawConfigParser):
    def _read(self, fp, fpname):
        data = StringIO("[data]\n"+fp.read()) 
        return ConfigParser.RawConfigParser._read(self, data, fpname)

p = Parser()
p.read("file.txt")
print dict(p.items("data"))

Вывод:

{'login': 'user', 'password': 'password', 'url/host': 'www.example.com'}

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

0 голосов
/ 16 мая 2010

РЕДАКТИРОВАТЬ: лучшее решение

for line in input: 
    key, val = re.search('(.*?):\s*(.*)', line).groups()
0 голосов
/ 16 мая 2010

Ну, если вы не знаете о регулярных выражениях, просто измените свой файл так:

Host = www.example.com
Login = uer
Password = password

И использовать модуль Python ConfigParser http://docs.python.org/library/configparser.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...