更改列表中列表中的元素

时间:2010-07-31 00:43:58

标签: python list csv

我正在将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'

这是正确的做法吗?

2 个答案:

答案 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:

好的,datacsvfile的函数,所以我们只是迭代第一个参数中的行。到目前为止,非常好。

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'

这就是你想要的吗?