簡體   English   中英

處理復雜的CSV文件

[英]Handling a complex CSV file

我有一個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.'}]

嘗試這個:

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']}]

不幸的是,您無法使用csv.DictReader讀取該內容,因為這是csv文件的非常非標准格式

您可能必須閱讀並手動解析。

我假設您總是希望有兩列,如果類型為空,則使用上一行的類型。

作為替代,可能值得更改格式並使A列中的值成為強制性的(如果由您控制),這可以解決您的一些問題,但不是全部,您仍然必須匯總來自csv閱讀器的結果。

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.']}]

如果您知道csv將是兩列,並且您將始終按照顯示的方式對它進行很好的分組,那么手動構建字典可能是最簡單的。 訣竅在於,當第一列中沒有值時,您想使用先前已知的值。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM