我正在将csv文件读入数据:
def get_file(start_file): #opens original file, reads it to array
with open(start_file,'rb') as f:
data=list(csv.reader(f))
我需要遍历每一行并向行[1]添加一个值。最初row[1] = 'Peanut'
,我需要添加'Butter',因此结果将是
row[1]='PeanutButter'
我需要为这样的每一行执行此操作
for row in data:
row+='Butter'
这是正确的做法吗?
答案 0 :(得分:5)
你想要
for row in data:
row[ 1 ] += "Butter"
但正确的做法是不再遍历data
的每一行,而是首先修改生成data
的方式。在另一个问题中查看我的答案。
def get_file( start_file )
f = csv.reader( start_file )
def data( csvfile ):
for line in csvfile:
line[ 1 ] += "butter"
yield line
return data( f )
你使用的
lines = get_file( "my_file.csv" )
for line in lines:
# do stuff
这里的问题是我们想要修改data
中保存的数据。我们可以查看并更改data
中的每个元素,但这很慢,特别是考虑到我们将很快再次查看每个元素。相反,一种更好的方法是将插入的行更改为数据持有者,因为这样可以节省一次。
这里是:
f = csv.reader( start_file )
我修改了代码以使用csv.reader
,因为这是一种更加健壮的读取CSV数据的方式。这基本上是一个微不足道的变化;它的作用类似open
,但每行都是值的元组,已经为你分开了。
def data( csvfile )
这是不同的!我们不是将数据变为变量,而是将其作为一个函数。这听起来不对,但请耐心等待。
for line in csvfile:
好的,data
是csvfile
的函数,所以我们只是迭代第一个参数中的行。到目前为止,非常好。
line[ 1 ] += butter
这是您想要进行的更改:我们将“黄油”添加到line
的第二个元素中。您还可以在此处进行其他更改:向每行添加一列,删除列,跳过行,列表继续!
yield line
这是一个聪明的Python技巧。它基本上像return
一样工作,但却没有停止运行的功能。相反,它会暂停,直到我们要求下一个值。
所以现在data
是一个函数,它依次返回每一行(按照你想要的那样修改)。现在怎么办?易:
return data( f )
让get_file
返回data
!
这是什么意思?好吧,我们现在可以将它用作for循环中的iterable:
for line in get_file( "my_file.csv" ):
一切都会奏效!!!魔法!! = P
其他几点:
以前,您使用了with ... as ...
语法。这是context manager
:当您完成文件后,它会自动关闭文件。但在这种情况下,我们不想这样做,因为我们正在通过从文件中读取行。将它转换为list
将整个内容复制到内存中,这是一个很好的例子。如果你担心内存泄漏,你应该在代码的其他地方添加f.close()。
我有另一点,但我记不起来了......
答案 1 :(得分:0)
for flist in data:
for element in flist:
element += 'butter'
这就是你想要的吗?