我目前正在尝试修改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属性),但是所有字段都被剥去了空格。有关如何实现此目的的任何提示吗?
答案 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)