Leyendo archivo csv y regresando como diccionario

He escrito una función que actualmente lee un archivo correctamente, pero hay un par de problemas. Debe devolverse como un diccionario donde las claves son nombres de artistas y los valores son listas de tuplas (no estoy seguro de esto, pero parece ser lo que se pide)

El principal problema que tengo es que de alguna manera debo omitir la primera línea del archivo y no estoy seguro si lo estoy devolviendo como un diccionario. Aquí hay un ejemplo de uno de los archivos:

"Artist","Title","Year","Total Height","Total Width","Media","Country" "Pablo Picasso","Guernica","1937","349.0","776.0","oil paint","Spain" "Vincent van Gogh","Cafe Terrace at Night","1888","81.0","65.5","oil paint","Netherlands" "Leonardo da Vinci","Mona Lisa","1503","76.8","53.0","oil paint","France" "Vincent van Gogh","Self-Portrait with Bandaged Ear","1889","51.0","45.0","oil paint","USA" "Leonardo da Vinci","Portrait of Isabella d'Este","1499","63.0","46.0","chalk","France" "Leonardo da Vinci","The Last Supper","1495","460.0","880.0","tempera","Italy" 

Así que necesito leer un archivo de entrada y convertirlo en un diccionario que tenga este aspecto:

 sample_dict = { "Pablo Picasso": [("Guernica", 1937, 349.0, 776.0, "oil paint", "Spain")], "Leonardo da Vinci": [("Mona Lisa", 1503, 76.8, 53.0, "oil paint", "France"), ("Portrait of Isabella d'Este", 1499, 63.0, 46.0, "chalk", "France"), ("The Last Supper", 1495, 460.0, 880.0, "tempera", "Italy")], "Vincent van Gogh": [("Cafe Terrace at Night", 1888, 81.0, 65.5, "oil paint", "Netherlands"), ("Self-Portrait with Bandaged Ear",1889, 51.0, 45.0, "oil paint", "USA")] } 

El principal problema que tengo es saltear la primera línea que dice “Artista”, “Título”, etc. y solo devolver las líneas después de la primera línea. Tampoco estoy seguro de si mi código actual lo está devolviendo como un diccionario. Esto es lo que tengo hasta ahora

 def convertLines(lines): head = lines[0] del lines[0] infoDict = {} for line in lines: #Going through everything but the first line infoDict[line.split(",")[0]] = [tuple(line.split(",")[1:])] return infoDict def read_file(filename): thefile = open(filename, "r") lines = [] for i in thefile: lines.append(i) thefile.close() mydict = convertLines(read_file(filename)) return lines 

¿Solo un par de pequeños cambios en mi código devolverían el resultado correcto o necesitaría abordar esto de manera diferente? Parece que mi código actual lee el archivo completo, pero ¿cómo podría omitir la primera línea y posiblemente regresar en representación de dictado si aún no lo está? Gracias por cualquier ayuda

Lo primero que hacemos es borrar la primera línea de la lista.

Luego ejecutamos una función para hacer exactamente lo que usted dice, hacer un diccionario con una lista de tuplas como valores.

Puede mantener la función que tiene y ejecutar esta operación en las líneas variables.

Bien ejecuta el siguiente código y deberías estar bien.

 def convertLines(lines): head = lines[0] del lines[0] infoDict = {} for line in lines: #Going through everything but the first line infoDict[line.split(",")[0]] = [tuple(line.split(",")[1:])] return infoDict def read_file(filename): thefile = open(filename, "r") lines = [] for i in thefile: lines.append(i) thefile.close() return lines mydict = convertLines(read_file(filename)) print(mydict) #Do what you want with mydict below this line 

Deberías intentar esto. Lo encontré muy simple

 import csv from collections import defaultdict d_dict = defaultdict(list) with open('file.txt') as f: reader = csv.reader(f) reader.next() for i in list(reader): d_dict[i[0]].append(tuple(i[1:])) print dict(d_dict) 

Salida:

 { 'Vincent van Gogh': [ ('Cafe Terrace at Night', '1888', '81.0', '65.5', 'oil paint', 'Netherlands'), ('Self-Portrait with Bandaged Ear', '1889', '51.0', '45.0', 'oil paint', 'USA') ], 'Pablo Picasso': [ ('Guernica', '1937', '349.0', '776.0', 'oil paint', 'Spain') ], 'Leonardo da Vinci': [ ('Mona Lisa', '1503', '76.8', '53.0', 'oil paint', 'France'), ("Portrait of Isabella d'Este", '1499', '63.0', '46.0', 'chalk', 'France'), ('The Last Supper', '1495', '460.0', '880.0', 'tempera', 'Italy') ] } 

El módulo csv proporciona herramientas útiles para procesar archivos CSV. Lo siguiente debe hacer:

 import csv from collections import defaultdict def read_file(filename): with open(filename, 'r') as f: reader = csv.DictReader(f, delimiter=',') result_dict = defaultdict(list) fields = ("Title", "Year", "Total Height", "Total Width", "Media", "Country") for row in reader: result_dict[row['Artist']].append( tuple(row[field] for field in fields) ) return dict(result_dict) 

El DictReader utiliza los campos en la primera línea del archivo como nombres de campo. A continuación, devuelve un iterable sobre las filas en el archivo que se producen como dicts con los nombres de campo como claves.

Una mejor manera de hacer es:

  with open('filename','r,') as file: # Make a file object items = [] _ = file.readline() # This will read the first line and store it in _ # a variable of no use. for line in file: # Next we start the for loop to read all other # data item.append(line) 

Una vez que este código se ejecute, la instrucción with-close cerrará el objeto de archivo. Así que no hay necesidad de hacer un f.close ()