我正在将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)
这是正确的做法吗?
你要
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().
我有另一点,但我记不起来了......