2012-01-05 6 views
3

私はPythonでコーディングし始めていますが、現在は問題があります.csv.DictReaderが間違ったデータタイプを取得します。python csv DictReaderタイプ

csvファイルには、次のようになります。

のCol1、Col2に、COL3

1,2,3

90,2,3

pol = csv.DictReader(open('..\data\data.csv'),dialect='excel') 

Col1 = [] 

for row in pol: 
    if row["Col1"] < 90: 
     Col1.append(row["Col1"] * 1.5) 
    else: 
     Col1.append("Col1") 

私は次のエラーを取得します:

if row["Col1"] < 90: 
TypeError: unorderable types: str() < int() 

Iすべての単一の値を変換しません。列の値を定義することは可能ですか?

答えて

0

Col1を数値の配列にしたいので、行["Col1"]を数値と比較しているかどうかにかかわらず数値に変換する必要があります。だからそれを変換してください!

2

CSVファイルに数値以外の値を引用し、

pol = csv.DictReader(open('..\data\data.csv'), 
    quoting=csv.QUOTE_NONNUMERIC, dialect="excel") 

でリーダーを初期化する場合は、数値が浮動小数点数に自動的に変換されます。

+0

残念ながら、これはまだヘッダーに窒息します。 –

+0

まさに私が探していたもの、ありがとう! – MoRe

1

私は前にDictReaderを使用していない、あなただけの値にこれを行うことができます:

row["Col1"] = float(row["Col1"]) 
:、あなたはおそらくも辞書を編集することができ

... 
for row in pol: 
    col1 = float(row["Col1"]) # or int() 
    ... 

そして出てCOL1を使用

しかし、それは後で行を使用するかどうかによって異なります。

7

あなたはpandasのようなライブラリを使うことができます。それはあなたのタイプを推測します(これは過労ですが、それは仕事です)。

import pandas 
data = pandas.read_csv(r'..\data\data.csv') 
# if you just want to retrieve the first column as a list of int do 
list(data.Col1) 
>>> [1, 90] 

# to convert the whole CSV file to a list of dict use 
data.transpose().to_dict().values() 
>>> [{' Col2': 2, ' Col3': 3, 'Col1': 1}, {' Col2': 2, ' Col3': 3, 'Col1': 90}] 

また、ここでは、入力されたDictReaderの実装です:

from csv import DictReader 
from itertools import imap, izip 

class TypedDictReader(DictReader): 
    def __init__(self, f, fieldnames=None, restkey=None, restval=None, \ 
     dialect="excel", fieldtypes=None, *args, **kwds): 

    DictReader.__init__(self, f, fieldnames, restkey, restval, dialect, *args, **kwds) 
    self._fieldtypes = fieldtypes 

    def next(self): 
    d = DictReader.next(self) 
    if len(self._fieldtypes) >= len(d) : 
     # extract the values in the same order as the csv header 
     ivalues = imap(d.get, self._fieldnames) 
     # apply type conversions 
     iconverted = (x(y) for (x,y) in izip(self._fieldtypes, ivalues)) 
     # pass the field names and the converted values to the dict constructor 
     d = dict(izip(self._fieldnames, iconverted)) 

    return d 

、ここではそれを使用する方法である:

reader = TypedDictReader(open('..\data\data.csv'), dialect='excel', \ 
    fieldtypes=[int, int, int]) 
list(reader) 
>>> [{' Col2': 2, ' Col3': 3, 'Col1': 1}, {' Col2': 2, ' Col3': 3, 'Col1': 90}]