Python 将csv文件转换为字典

Python 将csv文件转换为字典,python,file,python-3.x,csv,dictionary,Python,File,Python 3.x,Csv,Dictionary,我昨天问了这个问题,但我还是坚持不住。我已经编写了一个函数,目前可以正确读取文件,但是有几个问题 我遇到的主要问题是,我需要以某种方式跳过文件的第一行,我不确定是否将其作为字典返回。以下是其中一个文件的示例: “艺术家”、“头衔”、“年份”、“总高度”、“总宽度”、“媒体”、“国家” “巴勃罗·毕加索”、“格尔尼卡”、“1937”、“349.0”、“776.0”、“油画”、“西班牙” “文森特·梵高”、“夜间咖啡台”、“1888”、“81.0”、“65.5”、“油画”、“荷兰” “达芬奇”、“蒙

我昨天问了这个问题,但我还是坚持不住。我已经编写了一个函数,目前可以正确读取文件,但是有几个问题

我遇到的主要问题是,我需要以某种方式跳过文件的第一行,我不确定是否将其作为字典返回。以下是其中一个文件的示例:

“艺术家”、“头衔”、“年份”、“总高度”、“总宽度”、“媒体”、“国家”
“巴勃罗·毕加索”、“格尔尼卡”、“1937”、“349.0”、“776.0”、“油画”、“西班牙”
“文森特·梵高”、“夜间咖啡台”、“1888”、“81.0”、“65.5”、“油画”、“荷兰”
“达芬奇”、“蒙娜丽莎”、“1503”、“76.8”、“53.0”、“油画”、“法国”
“文森特·梵高”,“包扎耳朵的自画像”,“1889”,“51.0”,“45.0”,“油画”,“美国”
“达芬奇”、“伊莎贝拉·德埃斯特肖像”、“1499”、“63.0”、“46.0”、“粉笔”、“法国”
“达芬奇”、“最后的晚餐”、“1495”、“460.0”、“880.0”、“坦佩拉”、“意大利”
我需要读取一个与上面类似的文件,并将其转换为如下所示的字典:

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")]
      }
这是我到目前为止所拥有的。我当前的代码可以工作,但不能像上面的例子那样将文件转换成字典。谢谢你的帮助

def convertLines(lines):
    head = lines[0]
    del lines[0]
    infoDict = {}
    for line in lines:
        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
对我的代码进行几处小的更改是否会返回正确的结果,或者我是否需要以不同的方式进行处理?看起来我的当前代码读取了完整的文件。谢谢你的帮助

def convertLines(lines):
    head = lines[0]
    del lines[0]
    infoDict = {}
    for line in lines:
        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
编辑:@Julien它一直在工作(但不正确),直到今天早上我做了一些修改,它现在出现了一个递归错误。

您只需要这样:

def read_file(filename):
    with open(filename, "r") as thefile:
        mydict = convertLines(thefile.readlines()))
        return mydict

您当前的函数正在无限地调用自己。。。然后,如果需要,请修复您的
convertLines
函数。

这将稍微简化您的代码,但是我将标题行的处理留给您了

from collections import defaultdict
import csv

artists = defaultdict(list)

with open('artists.csv', 'r') as csvfile:
    reader = csv.reader(csvfile,delimiter=',')
    for row in reader:
        artists[row[0]].append(row[1:-1])

你对什么样的结果不满意?这是一种相关的信息,请分享!我打赌你只是覆盖了每个艺术家的结果,而不是添加到列表中……我当前的代码实际上给出了一个递归错误,但基本上我还无法创建一个字典,其中键是艺术家的名字,值是他们的画,所以对于上面的示例,应该有3个键,即使名称是可以在文件中重复,值是他们的画(1个代表毕加索,3个代表达芬奇,2个代表梵高),这听起来可能是问题所在。如果代码出现错误,为什么说代码可以工作?如果它给出了一个错误,那么就分享这个错误…谢谢,我认为这是正确的。你知道convertLines函数有什么问题吗?因为现在它说“超过了最大递归深度”,感谢它说“Diff是x个字符长”,而且在所有情况下,x都是一个非常大的数字,比如2000,当它应该更小的时候。你知道这是什么原因吗?我怎么知道?您的代码没有任何“差异”。你应该读一读。我认为diff指的是字典,每次我运行代码时,值似乎都会因每种情况而改变。这绝对是我一整天以来最难编程的函数