Сборка словаря из файла и os.listdir python - PullRequest
1 голос
/ 07 ноября 2011

Я использую os.listdir и файл для создания словаря.Я получаю ключи и значения от них соответственно.

os.listdir дает мне:

EVENT3180
EVENT2894
EVENT2996

и из файла я получаю:

3.1253   -32.8828   138.2464
11.2087   -33.2371   138.3230
15.8663   -33.1403   138.3051

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

{'EVENT3180': 3.1253   -32.8828   138.2464, 'EVENT2894': 11.2087   -33.2371   138.3230, 'EVENT2996': 15.8663   -33.1403   138.3051}

Так что я думаю, что мой код зацикливается на ключах, а не на значениях.Во всяком случае, мой код пока:

def reloc_event_coords_dic ():
    event_list = os.listdir('/Users/working_directory/observed_arrivals_loc3d')
    adict = {}
    os.chdir(path) # declared somewhere else
    with open ('reloc_coord_complete', 'r') as coords_file:
        for line in coords_file:
            line = line.strip() #Gives me the values
            for name in event_list: # name is the key
                entry = adict.get (name, [])
                entry.append (line)
                adict [name] = entry
            return adict

Спасибо за чтение!

1 Ответ

2 голосов
/ 07 ноября 2011

Вы хотите зациклить имена файлов и строки входного файла одновременно.Замените ваши вложенные циклы на

for name, line in zip(event_list, coords_file.readlines()):
    adict.setdefault(name, []).append(line.strip())

, где я позволил сжать тело вашего цикла в одну строку.

Если количество обрабатываемых данных очень велико, то замените zip с его ленивым двоюродным братом izip:

from itertools import izip

for name, line in izip(event_list, coords_file):
    # as before

Кстати, выполнение chdir в середине функции просто для того, чтобы захватить один файл - это запах кода.Вы можете легко открыть нужный файл с помощью open(os.path.join(path, 'reloc_coord_complete')).

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