更改列表中列表中的元素

l--*_*''' -4 python csv list

我正在将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))
Run Code Online (Sandbox Code Playgroud)

我需要遍历每一行并向行[1]添加一个值.最初row[1] = 'Peanut',我需要添加'Butter',结果就是这样

row[1]='PeanutButter'
Run Code Online (Sandbox Code Playgroud)

我需要为这样的每一行做这个

for row in data:
  row+='Butter'
Run Code Online (Sandbox Code Playgroud)

这是正确的做法吗?

Kat*_*iel 5

你要

for row in data:
    row[ 1 ] += "Butter"
Run Code Online (Sandbox Code Playgroud)

但要做到这一点,正确的方法是不通过的每一行遍历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 )
Run Code Online (Sandbox Code Playgroud)

你喜欢用的

lines = get_file( "my_file.csv" )
for line in lines:
    # do stuff
Run Code Online (Sandbox Code Playgroud)

说明

这里的问题是我们想要修改其中的数据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整合到一个复制到内存中,这是sloooooow.如果你担心内存泄漏,你应该在代码中的其他地方添加f.close().

  • 我有另一点,但我记不起来了......