2016-04-15 2 views
1

Я являюсь txt-файлом и беру строки и создавая первый мой ключ для своего словаря, который я создаю, а остальные будут моими значениями в качестве кортежа. Есть заголовок перед рукой, и я уже сделал свой код «игнорировать» его в начале.Из текстового файла в словарь

Пример значений тхт:

"Ronald Reagan","1981","8","69","California","Republican" 
"George Bush","1989","4","64","Texas","Republican" 
"Bill Clinton","1993","8","46","Arkansas","Democrat" 

Я хочу создать словарь, который дает следующий результат:

{"Ronald Reagan": (1981,8,69,"California", "Republican") etc.} 

Это то, что я currenltly есть, как мой код:

def read_file(filename): 
    d={} 
    f= open(filename,"r") 
    first_line = f.readline() 
    for line in f: 
     #line=line.strip('"') 
     #line=line.rstrip() 
     data=line.split('"') 
     data=line.replace('"', "") 

     print(data) 


     key_data=data[0] 

     values_data= data[1:] 
     valuesindata=tuple(values_data) 
     d[key_data]=valuesindata 

    print(d) 

read_file(filename) 

Первый оператор печати (я поставил его там, чтобы посмотреть, какой результат в этот момент был, и это дало мне следующее:

Ronald Reagan,1981,8,69,California,Republican 
George Bush,1989,4,64,Texas,Republican 

и т.д. К тому времени, он получает второе утверждение печати он делает следующее:

{'R': ('o', 'n', 'a', 'l', 'd', ' ', 'R', 'e', 'a', 'g', 'a', 'n', ',', '1', '9', '8', '1', ',', '8', ',', '6', '9', ',', 'C', 'a', 'l', 'i', 'f', 'o', 'r', 'n', 'i', 'a', ',', 'R', 'e', 'p', 'u', 'b', 'l', 'i', 'c', 'a', 'n', '\n'), 'G': ('e', 'o', 'r', 'g', 'e', ' ', 'B', 'u', 's', 'h', ',', '1', '9', '8', '9', ',', '4', ',', '6', '4', ',', 'T', 'e', 'x', 'a', 's', ',', 'R', 'e', 'p', 'u', 'b', 'l', 'i', 'c', 'a', 'n', '\n')} 

Кроме того, я разделив его на цитаты, потому что некоторые из моих строк содержат запятая как часть имени, например: «Carl, Jr.»

Я не хочу импортировать модуль csv, так есть ли способ сделать это?

+0

Это файл csv? – Radan

+0

да, но я ограничен и не могу импортировать какие-либо модули в качестве ограничения. – Nick

ответ

2

Основная проблема в вашем коде, ведущие в этот странный результат, что data переменная является строкой, data[0] даст вам первый символ, data[1:] остальное - вам нужно позвонить split(",") сначала разбить строку в списке.

У меня есть ограничение, чтобы не импортировать какие-либо модули.

Идея заключается в том, чтобы использовать split(",") разделить каждую строку на отдельные элементы и strip(), чтобы удалить кавычки вокруг значений элементов:

d = {} 
with open(filename) as f: 
    for line in f: 
     items = [item.strip('"').strip() for item in line.split(",")] 
     d[items[0]] = items[1:] 

print(d) 

Печать:

{'Bill Clinton': ['1993', '8', '46', 'Arkansas', 'Democrat'], 
'George Bush': ['1989', '4', '64', 'Texas', 'Republican'], 
'Ronald Reagan': ['1981', '8', '69', 'California', 'Republican']} 

FYI , используя csv module из стандартной библиотеки, было бы намного проще:

import csv 
from pprint import pprint 

d = {} 
with open(filename) as f: 
    reader = csv.reader(f) 
    for row in reader: 
     d[row[0]] = row[1:] 

pprint(d) 

Вы также можете использовать словарь понимание:

d = {row[0]: row[1:] for row in reader} 
+0

Да, я согласен, что жизнь станет намного проще, но у меня есть ограничение, чтобы не импортировать какие-либо модули. – Nick

+0

@ Ник в порядке, обновлен с образцом рабочего кода. – alecxe

3

Вы можете использовать csv модуль как alecxe предложил или вы можете сделать это "вручную", как так:

csv_dict = {} 

with open(csv_file, 'r') as f: 
    for line in f: 
     line = line.strip().replace('"', '').split(',') 
     csv_dict[line[0]] = tuple(int(x) if x.isdigit() else str(x) for x in line[1:]) 

Это приведет к удалению двойных кавычек, приведение числовых значений в int и создание словаря кортежей.

+0

Это хорошо работало для имен, у которых не было запятой. Таким образом, он работает с такими именами, как «Рональд Рейган», но не для таких имен, как «Рональд Рейган-младший» , так как он разделит имя на «Рональд Рейган» «Jr.» – Nick

+0

@Nick True, для этого вам понадобится модуль 'csv' или более сложное ручное управление линиями; то есть для проверки запятых в кавычках и обработки этих кросс-дел по-другому – jDo

+0

вы были очень полезны, я просто потерялся в том, как идти об этом в противном случае, не разделяя туда, где запятые включают имена. – Nick

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