如何复制python DictReader对象?

时间:2018-01-04 06:59:43

标签: python csv object strip

我目前正在尝试修改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中每个单元格的所有空格。我有这个功能:

csv.DictReader(input_file)

然而,这个函数的问题是返回的阅读器已经被迭代了,所以我不能重复它(如果我只是调用DictReader,我就能这样做。我希望能够创建一个与 julian=function(x) { if(x>0) { x=as.character(x) year=substr(x,1,4) days=as.integer(substr(x,5,7))-1 return(as.Date(paste("01/01/",year),format="%m/%d/%Y")+days) } return(NULL) } 完全相同的新对象(即,也具有fieldnames属性),但是所有字段都被剥去了空格。有关如何实现此目的的任何提示吗?

2 个答案:

答案 0 :(得分:2)

两件事:首先,读者是一个懒惰的迭代器对象,它在一次完整运行后耗尽(意味着一旦你在函数结束时返回它就会为空!),所以你必须收集修改后的行在列表中并最后返回该列表或使enter image description here生成修改后的行。其次,function a generator不会就地修改字符串(字符串是不可变的),但会返回一个新的剥离字符串,因此您必须将该新值重新绑定到旧键:

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

答案 1 :(得分:-2)

我更喜欢使用继承,按如下方式创建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)