【问题标题】:Converting csv file to dictionary将csv文件转换为字典
【发布时间】:2017-03-27 10:18:28
【问题描述】:

我昨天问了这个问题,但仍然坚持。我编写了一个当前可以正确读取文件的函数,但存在一些问题。

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

"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"

我需要读取一个类似上面的文件并将其转换成一个字典,如下所示:

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

只是对我的代码进行一些小的更改会返回正确的结果,还是我需要以不同的方式处理这个问题?看来我当前的代码读取了完整的文件。感谢您的帮助

编辑:@Julien 它一直在工作(但不正确),直到我今天早上做了一些修改,它现在给出了一个递归错误。

【问题讨论】:

  • 您对什么结果不满意?这是相关的信息,请分享!
  • 我打赌你只是覆盖了每个艺术家的结果,而不是附加到列表中......
  • 我当前的代码实际上给出了递归错误,但基本上我无法创建一个字典,其中键是艺术家姓名,值是他们的画作,所以对于上面的例子应该有3 个键,尽管名称可以在文件中重复,值是他们的画作(毕加索 1 个,达芬奇 3 个,梵高 2 个)
  • 听起来可能是问题
  • 如果你的代码出错了,你为什么说你的代码可以工作?如果它给出错误然后分享错误......

标签: python file python-3.x csv dictionary


【解决方案1】:

你只想要这个:

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

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

【讨论】:

  • 谢谢,我认为这是在正确的轨道上,你知道 convertLines 函数有什么问题吗,因为现在它说“超出最大递归深度”
  • 感谢它的说法“差异是 x 个字符长”,并且 x 在所有情况下都是一个像 2000 一样的离谱数字,而它应该更小。你知道是什么原因造成的吗?
  • 我该怎么办?您的代码没有任何“差异”。你应该阅读How to Ask
  • 我认为 diff 指的是字典,每次我运行代码时,每个案例的值似乎都会改变。这绝对是我开始编程一整天以来最艰难的功能
【解决方案2】:

这应该会稍微简化你的代码,但是我已经把标题行的处理留给你了。

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])

【讨论】:

    猜你喜欢
    • 2016-01-28
    • 2021-12-22
    • 2017-09-13
    • 2014-03-01
    • 2020-12-24
    • 2019-02-01
    • 1970-01-01
    • 2018-08-13
    • 2015-02-08
    相关资源
    最近更新 更多