2017-10-19 61 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'}]