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
不是现成的,不是。您是如何指定这种转换的?@MartijnPieterscsv.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方法。非常优雅,几乎正是我在上面原始问题中的评论所希望的。