2017-10-19 5 views
1

Textfile:Comment créer une liste de dictionnaires en utilisant pour boucle?

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

Mon code à ce jour pour lire le fichier et créer une liste:

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) 

Comment puis-je créer une liste de dictionnaires avec la sortie suivante?

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

Vous êtes très proche ... 'i.split()' 'grand écart î' mais jette alors loin la liste des résultats parce que vous ne l'attribuez pas à quelque chose. Vos références à 'i [0]' etc. sont alors des références aux premiers caractères de la ligne originale. De plus, vous devriez mettre votre initialisation 'dic' dans la boucle afin d'obtenir un nouveau dictionnaire pour chaque ligne. – kindall

Répondre

2

Vous pouvez simplement utiliser la bibliothèque de lecteurs csv pour gérer cela.

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

Assurez-vous de '.strip()' the row [i] '. Il semble qu'il y ait un espace supplémentaire après les virgules. – James

+0

Oui. J'ai oublié d'ajouter ça. Merci. –

0

Il est très similaire à répondre plus tôt par @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

Si vous ne souhaitez pas utiliser un lecteur CSV (bien que ce soit probablement la meilleure idée), vous pouvez aussi le faire en utilisant liste/compréhensions dictionnaire

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

Voici comment modifier votre code faire correctement (et suivez les recommandations de plus près 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) 

Sortie:

[{'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'}]