2017-10-19 62 views
1

文本文件:如何使用for循環創建詞典列表?

VIP Room,  10, 250 
Executive Room,30, 500 
Pool Site,  50, 850 
Banquet Hall, 200, 1000 
Chamber Hall, 500, 2000 
Concert Hall, 1000, 3500 

到目前爲止我的代碼讀取該文件,並創建一個列表:

def readVenueList(): 
    dic={} 
    venueList=[] 
    f=open("venue.txt","r") 
    for line in f: 
     line = line.split(",") 
     print(line) 
     for i in line: 
      i.split() 
      dic["name"]=i[0] 
      dic["num"]=i[1] 
      dic["cost"]=i[2] 
      venueList.append(dic) 
    return(venueList) 

如何創建與下面的輸出詞典列表?

venueList = [{'cost': '250', 'name': 'VIP Room', 'num': '10'}, 
      {'cost': '250', 'name': 'Executive Room', 'num': '30'}, 
       # and so on and so forth... 
      ] 
+0

你很近...'i.split()''分裂,但i'然後扔掉結果列表,因爲你不分配回事情。然後你對'i [0]'的引用就是對原始行的前幾個字符的引用。另外,你應該在循環中加入'dic'初始化,以便爲每一行獲得一個新的字典。 – kindall

回答

2

您可以簡單地使用csv閱讀器庫來處理這個問題。

import csv 
headers = ['name', 'num', 'cost'] 
with open('venue.txt', 'r') as f: 
    reader = csv.reader(f) 
    needed_list = [{headers[i]: row[i].strip() for i in range(3)} for row in reader] 
+0

一定要'.strip()''行[i]'。看起來逗號後面有一個額外的空格。 – James

+0

是的。我忘了補充一點。謝謝。 –

0

如果你不想使用CSV閱讀器(雖然這可能是最好的主意),你也可以做到這一點使用它是由@NM

datablob = u"""VIP Room,10,250 
Executive Room,30,500 
Pool Site,50,850 
Banquet Hall,200,1000 
Chamber Hall,500,2000 
Concert Hall,1000,3500 
""" 
from csv import reader 
from io import StringIO 

def readVenueList(fd): 
    c = reader(fd) 
    hdr = ["name", "num", "cost"] 
    for i in c: 
     d = {} 
     for el, v in enumerate(i): 
      d[hdr[el]] = v 
     yield d 

if __name__ == '__main__': 
    # replace with file object 
    # file = open("archive1.csv") 
    file = StringIO(datablob) 
    print(list(readVenueList(file))) 
    # Output 
    [{'name': 'VIP Room', 'num': '10', 'cost': '250'}, {'name': 
    'Executive Room', 'num': '30', 'cost': '500'}, {'name': 'Pool 
     Site', 'num': '50', 'cost': '850'}, {'name': 'Banquet Hall', 
    'num': '200', 'cost': '1000'}, {'name': 'Chamber Hall', 'num': 
    '500', 'cost': '2000'}, {'name': 'Concert Hall', 'num': '1000', 
    'cost': '3500'}] 
0

非常類似於早期的答案列表/字典推導

with open('venue.txt', 'r') as f: 
    lines = (line.split(',') for line in f) 
    venues = [ 
     {'name': name.strip(), 'number': int(num), 'cost': int(cost)} 
     for name, num, cost in lines 
    ] 
0

下面是如何修改的代碼做正確(並按照PEP 8 - Style Guide for Python Code建議更緊密地):

from pprint import pprint 

def readVenueList(): 
    venueList = [] 

    with open("venue.txt", "r") as f: 
     for line in f: 
      dic = {} 
      items = [item.strip() for item in line.split(",")] 
      dic["name"] = items[0] 
      dic["num"] = items[1] 
      dic["cost"] = items[2] 
      venueList.append(dic) 

    return venueList 

venueList = readVenueList() 
pprint(venueList) 

輸出:

[{'cost': '250', 'name': 'VIP Room', 'num': '10'}, 
{'cost': '500', 'name': 'Executive Room', 'num': '30'}, 
{'cost': '850', 'name': 'Pool Site', 'num': '50'}, 
{'cost': '1000', 'name': 'Banquet Hall', 'num': '200'}, 
{'cost': '2000', 'name': 'Chamber Hall', 'num': '500'}, 
{'cost': '3500', 'name': 'Concert Hall', 'num': '1000'}]