2013-03-27 73 views
3

在我的Python应用程序中,我将各种字段的值保存到一个文本文件中,并决定使用CSV格式,以便以可读的方式在Excel中打开它。我也可以修改文件中的值并在应用程序中导入这些值。该文件中的格式如下:处理子类别的Python CSV文件

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文件不是太大的问题,但我想知道是如何分离的类别,因为我没有的参数相同数量为每一个。我一直在使用Python的csv模块和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类与另一组字段名?

谢谢。

+0

不理解预期的输出。请更新'Category 1'应该产生什么 – 2013-03-27 13:40:50

+0

为什么不为每个类别使用单个文件? – skndstry 2013-03-27 14:00:05

回答

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将是一个嵌套字典。文件的每个部分都将是字典中的一个键,相应的项目将是另一个字典,将该部分中的每一行保存为字典。

+0

我只是由Excel导致的一个小问题,它在类别2行的末尾添加了空值。运行你的代码的结果是:'ValueError:对于int()以10为底的无效字面值:'''。但是,手动删除CSV文件中的额外逗号使其按预期工作。非常感谢。 – jfmorin 2013-03-27 15:34:56

+0

很高兴听到它的工作!实际上也很容易让它忽略来自Excel的额外列。我在代码的倒数第二行添加了'if p',它完成了这项工作。 – Mike 2013-03-27 16:12:15