如何复制python DictReader对象?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何复制python DictReader对象?相关的知识,希望对你有一定的参考价值。
我正在尝试修改DictReader
对象以去除csv中每个单元格的所有空格。我有这个功能:
def read_the_csv(input_file):
csv_reader = csv.DictReader(input_file)
for row in csv_reader:
for key, value in row.items():
value.strip()
return csv_reader
但是,这个函数的问题是返回的读者已经被迭代了,所以我不能重复它(如果我只是调用csv.DictReader(input_file)
,我就能这样做。我希望能够创建一个与DictReader
完全相同的新对象(也就是说,也有fieldnames属性),但是所有字段都被剥去了空格。有关如何实现这一点的任何提示?
答案
两件事:首先,读者是一个懒惰的迭代器对象,它在一次完整运行后耗尽(这意味着一旦你在函数结束时返回它就会为空!),所以你必须在列表中收集已修改的行并在最后返回该列表或使function a generator生成修改后的行。其次,str.strip()
不会就地修改字符串(字符串是不可变的),但会返回一个新的剥离字符串,因此您必须将该新值重新绑定到旧键:
def read_the_csv(input_file):
csv_reader = csv.DictReader(input_file)
for row in csv_reader:
for key, value in row.items():
row[key] = value.strip() # reassign
yield row
现在你可以像使用DictReader
一样使用那个生成器函数:
reader = read_the_csv(input_file)
for row in reader:
# process data which is already stripped
另一答案
我更喜欢使用继承,创建DictReader的子类如下:
from csv import DictReader
from collections import OrderedDict
class MyDictReader(DictReader):
def __next__(self):
return OrderedDict({k: v.strip()
for k, v in super().__next__().items()})
用法,就像DictReader一样:
with open('../data/risk_level_model_5.csv') as input_file:
for row in MyDictReader(input_file):
print(row)
以上是关于如何复制python DictReader对象?的主要内容,如果未能解决你的问题,请参考以下文章
Python 3.2 在 csv.DictReader 中跳过一行
带有 UTF-8 数据的 Python CSV DictReader