处理复杂的CSV文件

时间:2014-08-08 14:38:31

标签: python csv

我有一个CSV文件,如:

<img src="">

我想使用Python转换为字典,字典应如下所示:

[{'Type': ['Date'], 'Value': ['dd/mm/yyyy']}, 
 {'Type': ['Gender'], 'Value': ['Male', 'Female']},
 {'Type': ['Title'], 'Value': ['Mr.', 'Mrs.', 'Ms.']}]

目前我已尝试过以下方法:

import csv
import collections

with open('test2.csv', 'rU') as fin:
   reader = csv.DictReader(fin)

   data = []
   for row in reader:
       data.append(row)
   print data

输出是:

[{'Type': 'Date', 'Value': 'dd/mm/yyyy'}, 
 {'Type': 'Gender', 'Value': 'Male'}, 
 {'Type': '', 'Value': 'Female'}, 
 {'Type': 'Title', 'Value': 'Mr.'}, 
 {'Type': '', 'Value': 'Mrs.'}, 
 {'Type': '', 'Value': 'Ms.'}]

4 个答案:

答案 0 :(得分:0)

试试这个:

import csv

data=[]
with open(fn, 'rU') as fin:
    reader=csv.reader(fin, dialect='excel')
    header=next(reader)
    for row in reader:
        di={k:[v] for k,v in zip(header, row)}
        if di[header[0]]==['']:
            data[-1][header[1]].extend(di[header[1]]) 
        else:
            data.append(di) 

>>> data
[{'Type': ['Date'], 'Value': ['dd/mm/yyyy']}, {'Type': ['Gender'], 'Value': ['Male', 'Female']}, {'Type': ['Title'], 'Value': ['Mr.', 'Mrs', 'Ms']}]

答案 1 :(得分:0)

遗憾的是,在使用csv.DictReader时你无法读取它,因为这是非常非标准的csv文件格式

您可能需要阅读并手动解析它。

我假设您总是期望两列,如果类型为空,则使用上一行的类型。

作为替代方案,可能值得更改格式并使A列中的值成为必需(如果它是您控制的),这可以解决您的一些问题,但不是全部,您仍然需要重新集中来自csv阅读器的结果

答案 2 :(得分:0)

import csv
from pprint import pprint

with open('test.csv','r') as test_file:
    reader = csv.reader(test_file, delimiter=',')

    output = []
    last_key = None

    for row in reader:
        if row[0]:
            last_key = row[0]
            output.append({row[0]:[row[1]]})
        else:
            output[-1][last_key].append(row[1])

pprint(output)

>>> 
[{'Type': ['Value']},
 {'Date': ['dd/mm/yy']},
 {'Gender': ['Male', 'Female']},
 {'Title': ['Mr.', 'Mrs.', 'Ms.']}]

答案 3 :(得分:0)

如果您知道您的csv将是两列,并且您知道它将始终按照您显示的方式进行良好分组,那么手动构建字典可能最简单。诀窍是,当第1列中没有值时,您想要使用先前已知的值。

from collections import defaultdict
import csv

last_key = None
data = defaultdict(list)
with open('test2.csv', 'rU') as fin:
    csv_reader = csv.reader(fin, delimiter=',')
    for row in csv_reader:
        key, value = row[0], row[1]
        if key:
            data[key].append(value)
            last_key = key
        else:
            data[last_key].append(value)