2016-04-15 81 views
1

我是一個txt文件,並取得字符串,併爲我創建的字典創建第一個密鑰,其餘部分將作爲元組的值。有一個標題,我已經讓我的代碼在開始時「忽略」它。從文本文件到字典

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 

等。通過它到達第二個print語句時將執行以下操作:

{'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