Обработка .txt файла в словарь (Python v2.7) - PullRequest
1 голос
/ 09 ноября 2011

Я сейчас пытаюсь обработать и проанализировать информацию из этого .txt файла .Файл выглядит как разделитель табуляции.Я пытаюсь разобрать значение base 16 (т. Е. 000000) в качестве ключа словаря и название компании (т. Е. Xerox Corporation) в качестве значения словаря.Поэтому, если, например, я найду в своем словаре ключ 000001, в качестве соответствующего значения будет возвращена корпорация Xerox.

Я попытался проанализировать файл .txt как csv, читающий запись в каждой n-й строке.но, к сожалению, нет шаблона, и n-е число меняется.

Есть ли способ, например, захватить значение, предшествующее термину «основание 16», а затем термин, следующий за ним, для создания словарной записи?

Большое спасибо

Ответы [ 4 ]

1 голос
/ 09 ноября 2011
>>> import urllib
... 
... f = urllib.urlopen('http://standards.ieee.org/develop/regauth/oui/oui.txt')
... d = dict([(s[:6], s[22:].strip()) for s in f if 'base 16' in s])
... print d['000001']
XEROX CORPORATION
1 голос
/ 09 ноября 2011

Записи скважины разделены двумя символами новой строки.Вторая строка всегда является base16.Данные перед первой вкладкой - это ключ base16, а последней - название компании.

import urllib

inputfile = urllib.urlopen("http://standards.ieee.org/develop/regauth/oui/oui.txt")
data = inputfile.read()

entries = data.split("\n\n")[1:-1] #ignore first and last entries, they're not real entries

d = {}
for entry in entries:
    parts = entry.split("\n")[1].split("\t")
    company_id = parts[0].split()[0]
    company_name = parts[-1]
    d[company_id] = company_name

Некоторые результаты:

40F52E: Leica Microsystems (Schweiz) AG
3831AC: WEG
00B0F0: CALY NETWORKS
9CC077: PrintCounts, LLC
000099: MTX, INC.
000098: CROSSCOMM CORPORATION
000095: SONY TEKTRONIX CORP.
000094: ASANTE TECHNOLOGIES
000097: EMC Corporation
000096: MARCONI ELECTRONICS LTD.
000091: ANRITSU CORPORATION
000090: MICROCOM
000093: PROTEON INC.
000092: COGENT DATA TECHNOLOGIES
002192: Baoding Galaxy Electronic Technology  Co.,Ltd
90004E: Hon Hai Precision Ind. Co.,Ltd.
002193: Videofon MV
00A0D4: RADIOLAN,  INC.
E0F379: Vaddio
002190: Goliath Solutions
1 голос
/ 09 ноября 2011
def oui_parse(fn='oui.txt'):
    with open(fn) as ouif:
        content = ouif.read()
    for block in content.split('\n\n'):
        lines = block.split('\n')

        if not lines or not '(hex)' in lines[0]: # First block
            continue

        assert '(base 16)' in lines[1]
        d = {}
            d['oui'] = lines[1].split()[0]
        d['company'] = lines[1].split('\t')[-1]
        if len(lines) == 6:
            d['division'] = lines[2].strip()
        d['street'] = lines[-3].strip()
        d['city'] = lines[-2].strip()
        d['country'] = lines[-1].strip()
        yield d

oui_info = list(oui_parse())
1 голос
/ 09 ноября 2011
result = dict()
for lig in open('oui.txt'):
    if 'base 16' in lig:
        num, sep, txt = lig.strip().partition('(base 16)')
        result.[num.strip()] = txt.strip()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...