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指的是字典,每次我运行代码时,值似乎都会因每种情况而改变。这绝对是我一整天以来最难编程的函数