python csv DictReader类型

use*_*891 4 python csv types

我开始在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")
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

if row["Col1"] < 90:
TypeError: unorderable types: str() < int()
Run Code Online (Sandbox Code Playgroud)

我不会转换每一个值.是否可以定义列的值?

小智 8

您可以使用像熊猫一样的库,它会为您推断出类型(这有点过分但它可以完成工作).

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}]
Run Code Online (Sandbox Code Playgroud)

或者这里是一个类型化的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
Run Code Online (Sandbox Code Playgroud)

以下是如何使用它:

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}]
Run Code Online (Sandbox Code Playgroud)


wye*_*bee 6

如果您引用 csv 文件中的非数字值并通过以下方式初始化读取器

pol = csv.DictReader(open('..\data\data.csv'),
    quoting=csv.QUOTE_NONNUMERIC, dialect="excel")
Run Code Online (Sandbox Code Playgroud)

然后数值将自动转换为浮点数。


Sco*_*ter 0

看起来您希望 Col1 成为数字数组,因此无论您是否将其与数字进行比较,都需要将 row["Col1"] 转换为数字。所以转换一下吧!