如何复制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 中跳过一行

使用Python DictReader获取特定的行和值

带有 UTF-8 数据的 Python CSV DictReader

CSV DictReader,如何强制“”中的部分作为列表而不是字符串读取

Python Dictreader 对字段名进行排序

python Python:csv.DictReader(csvfile),for循环