Python 是否可以让csv.DictReader将某些列格式化为字符串以外的格式?

Python 是否可以让csv.DictReader将某些列格式化为字符串以外的格式?,python,csv,python-2.7,Python,Csv,Python 2.7,csv.DictReader()默认情况下,将列中的值作为字符串提取有没有办法指定特定列的转换? 每次访问由csv.DictReader()创建的字典列表时,我都会遇到很多这样的小麻烦: with open("data.csv","r") as data_file: items = csv.DictReader(data_file, fieldnames=('id', 'length', 'note')) for item in items: item['leng

csv.DictReader()
默认情况下,将列中的值作为字符串提取有没有办法指定特定列的转换?

每次访问由
csv.DictReader()
创建的字典列表时,我都会遇到很多这样的小麻烦:

with open("data.csv","r") as data_file:
    items = csv.DictReader(data_file, fieldnames=('id', 'length', 'note'))
    for item in items:
        item['length'] = float(item['length'])  #### <--- MINOR ANNOYANCE 
        # ... do loop stuff
打开(“data.csv”、“r”)作为数据文件:
items=csv.DictReader(数据文件,字段名=('id','length','note'))
对于项目中的项目:

item['length']=float(item['length'])######不是现成的,不是。您可以子类化
DictReader()
或创建一个生成器函数来为您映射行:

def convert_fields(iterable, **conversions):
    for item in iterable:
        for key in item.viewkeys() & conversions:
            item[key] = conversions[key](item[key])
        yield item
对于Python3,将dict.keys()替换为
dict.keys()
,因为Python3默认返回字典视图

用它包装您的
csv.DictReader()
,为每个列添加转换函数:

with open("data.csv","r") as data_file:
    items = csv.DictReader(data_file, fieldnames=('id', 'length', 'note'))
    items = convert_fields(items, length=float)
    for item in items:
        # item['length'] is now always a float
对于未映射到python标识符(带空格等)的列名,请使用
**{..}
语法传入字典:

with open("data.csv","r") as data_file:
    items = csv.DictReader(data_file, fieldnames=('id', 'length', 'note'))
    fieldconv = {'id': int, 'length': float, 'spaced column': float}
    items = convert_fields(items, **fieldconv)
    for item in items:
        # item['length'] and item['spaced column'] are now floats
        # item['id'] is always an int

不是现成的,不是。您是如何指定这种转换的?@MartijnPieters
csv.DictReader(数据文件,字段名=('id','length','note'),fieldconv={'id':int',length':float})
其中未指定
fieldconv
,或者无法转换字段,请使用默认的
str()
。你能详细说明一下
“间隔列”的想法吗?我不太明白它的用途。@Jamie:该函数允许您将转换器指定为关键字参数,但函数的文字关键字参数必须是有效的Python标识符。也就是说,除非您使用字典并使用
**映射
语法将其作为一组关键字参数应用。所以通常情况下,
convert_字段(items,spaced columnname=float)
是无效的Python,但是
convert_字段(items,**{spaced columnname':float})
不是。@Jamie:另一种方法是始终必须为转换映射指定一个参数,即字典;但是,由于您已经可以为
DictReader()
指定短字段名,因此更紧凑地使用关键字参数有助于实现漂亮、干净的Python语法。这似乎是
DictReader
的一个很好的扩展。考虑到python中已经有了什么,我很惊讶它还没有出现。是的,我更喜欢使用关键字的python方法。非常优雅,几乎正是我在上面原始问题中的评论所希望的。