3

在我的 Python 应用程序中,我将各个字段的值保存到一个文本文件中,我决定使用 CSV 格式,以便可以在 Excel 中以可读的方式打开它。我还可以修改文件中的值并将它们导入应用程序。文件中的格式如下所示:

Category 1, Param 1, Param 2, Param 3, Param 4
Command 1, 100, 123, 456, 1000
Command 2, 980, 312, 567, 882
Command 3, 0, 111, 584, 223
Category 2, Param A, Param B, Param C
Command A, 24, 14, 66
Command B, 59, 0, 123

保存 CSV 文件不是什么大问题,但我想知道的是如何分隔类别,因为每个类别的参数数量都不相同。我一直在使用csvPython 的模块和DictReader方法,但它只是抓取所有内容并将其放在同一个篮子中。因此,例如,如果我使用此代码:

def parseCsvFile(self, paramsfile):
    with open(paramsfile, 'rb') as csvfile:
        paramNames = ['Category', 'Param 1', 'Param 2', 'Param 3', 'Param 4']
        paramsReader = csv.DictReader(csvfile, fieldnames=paramNames)
        for row in paramsReader:
            print row['Category']

我会得到这个结果:

Category 1
Command 1
Command 2
Command 3
Category 2
Command A
Command B

有没有办法先检索类别 1 的数据,然后使用另一组字段名检索类别 2?

谢谢。

4

1 回答 1

2

我认为真正的问题是它csv.DictReader真的不是为这种文件设计的。特别是,它假定应该使用相同的字典来寻址整个文件中的每一行。但是您正在中途更改线路的类型。相反,您应该只使用csv.reader.

我猜您仍然想将您的数据作为字典来处理;在这种情况下,您只需要自己创建字典。我还猜测您希望将数据处理为整数;如果不替换int下面的相关内容。以下是我认为你想要的:

def parseCsvFile(self, paramsfile) :
    import csv
    csvDict = {}
    category = 'Unknown Category'
    params = []
    with open(paramsfile, 'rb') as csvfile :
        paramsReader = csv.reader(csvfile)
        for row in paramsReader :
            if row[0].startswith('Category') :
                category = row[0]
                csvDict[category] = {}
                params = [p.strip() for p in row[1:] if p]
            else :
                csvDict[category][row[0]] = dict(zip(params, [int(p) for p in row[1:] if p]))
    return csvDict

返回的字典 csvDict 将是一个嵌套字典。文件的每个部分将是字典中的一个键,相应的项将是另一个字典,该字典将该部分中的每一行作为字典保存。

于 2013-03-27T14:13:55.827 回答