2015-05-21 2 views
1

У меня возникли проблемы с преобразованием текстового файла в словарь python. К счастью, текстовый файл имеет «:», который делит мой будущий ключ на его значение. Например, каждая строка структурирована, как этот «-Project Manager: John Caldwell». Id нравится прокручивать каталог, содержащий множество текстовых файлов. В идентификаторе процесса нужно отбросить «-», который имеет каждая строка. Вот код, который я до сих пор:преобразование текстового файла в словарь python

import sys, traceback,os, csv, itertools 
from collections import defaultdict 

def get_metadata(filepath): 
    d = defaultdict(list) 
    for files in filepath: 
     if files.endswith(".txt"): 
      with open(files,'r') as in_file: 
       for line in in_file: 
        k,v = line.strip('-').split(':') 
        d[k].append(v) 

    return d 

root_directory = get_metadata("C:\Random") 
print root_directory 

Это то, что я получаю, когда я запустить скрипт

defaultdict(<type 'list'>, {}) 
+0

В качестве примечания стороны не используйте неизолированные обратные косые черты в неровных строковых литералах. Вы здесь, чтобы уйти отсюда, но попробуйте его с помощью «C: \ random», и вы получите неприятный сюрприз. Вы можете использовать необработанную строку ('r" C: \ Random "'), избегать обратных косых черт ('' C: \\ Random ") или (за исключением редких случаев) вместо этого использовать косые черты (' "C:/Random "'). – abarnert

+0

Кроме того, ваши ценности в конце концов получат новые строки. Вам может понадобиться 'line.rstrip(). Lstrip ('-'). Split (':')' или аналогичный, чтобы позаботиться об этом. – abarnert

+0

@abarnert Я получаю это как за ошибку: ValueError: требуется больше, чем 1 значение для распаковки – user40720

ответ

3

Проблема заключается в том, что "C:\Random" не список файлов, это просто строка. Итак, for files in filepath дает вам 'C', затем ':', затем '\' и так далее. Ни один из них не заканчивается в .txt, поэтому вы не открываете никаких файлов или ничего не делаете.

Возможно, что вы хотите for files in os.listdir(filepath):.

Или, если вы хотите открыть все файлы в этом каталоге или в любых подкаталогах (рекурсивно), используйте walk (см. Связанные документы для примера кода).

Как bgporter указывает на то, если единственная причина, вы звоните listdir, чтобы затем проверить каждое имя файла против шаблона, вы можете захотеть использовать for files in glob.glob(os.path.join(filepath, '*.txt')): пропустить необходимость испытания if.

+1

... или используйте 'glob.glob()', чтобы просто получить список файлов .txt, которые представляют интерес ... – bgporter

+0

@bgporter: Хорошая точка; добавлен в ответ. Благодарю. – abarnert

+0

Отличная обратная связь! Id принимает часть, в которой я конвертирую txt в словарь правильно? Его давая мне ValueError ValueError: вам нужно больше, чем 1 значение для распаковки – user40720

Смежные вопросы