【问题标题】:make a change to an element within a list within a list在列表中对列表中的元素进行更改
【发布时间】:2011-03-23 12:32:13
【问题描述】:

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

我需要遍历每一行并像这样向 row[1] 添加一个值。最初row[1] = 'Peanut',我需要添加“黄油”所以结果是

row[1]='PeanutButter'

我需要像这样对每一行都这样做

for row in data:
  row+='Butter'

这是正确的做法吗?

【问题讨论】:

  • -1 你刚刚问了这个确切的问题。去澄清这一点,而不是开始一个新的。
  • 这是一个完全不同的问题
  • 这完全是同一个问题,只是做了非常非常的小改动。问题是如何修改迭代的每一行,你只是改变你想要的修改。
  • 嗯,是的。这就像问如何将两个数加到一个数字上,然后再问如何减一个。我已将上一个答案中的代码复制并粘贴到此处。
  • 不用担心。您应该尝试了解这样做的方式,因为它会使这(以及处理数据的未来问题)变得更加容易。请询问您是否愿意我稍微解释一下代码。

标签: python list csv


【解决方案1】:

你想要

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 循环中的可迭代对象:

for line in get_file( "my_file.csv" ):

一切都会好起来的!!!魔法!! =p

其他几点:

  • 以前,您使用with ... as ... 语法。这是context manager:当您完成文件时,它会自动关闭文件。但在这种情况下,我们不想这样做,因为我们正在读取文件中的行。将其转换为 list 会将整个内容复制到内存中,这太慢了。如果您担心内存泄漏,您应该在代码的其他位置添加 f.close()。

  • 我还有一点,但我不记得了……

【讨论】:

  • 哇哇哇!!!太感谢了!!我从这篇文章中学到了很多东西。我真的很感谢你的时间。
【解决方案2】:
for flist in data:
    for element in flist:
         element += 'butter'

这是你想要的吗?

【讨论】:

  • 不,我相信这会写入 flist 中的每个元素,我只需要在特定列中写入
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多