如何在python中将.csv更改为列表,反之亦然?

如何在python中将.csv更改为列表,反之亦然?,python,list,csv,Python,List,Csv,我需要拆分一个.csv文件: user1,pass1,email1 user2,pass2,email2 user3,pass3,email3 分为3个列表,可以单独调用和附加 with open('userdata.csv', 'r') as f: userlist = [row[0] for row in csv.reader(f)] passlist = [row[1] for row in csv.reader(f)] emaillist = [row[2] f

我需要拆分一个.csv文件:

user1,pass1,email1
user2,pass2,email2
user3,pass3,email3
分为3个列表,可以单独调用和附加

with open('userdata.csv', 'r') as f:
    userlist = [row[0] for row in csv.reader(f)]
    passlist = [row[1] for row in csv.reader(f)]
    emaillist = [row[2] for row in csv.reader(f)]
print(userlist)
print(passlist)
print(emaillist)
我需要此代码返回:

['user1', 'user2', 'user3']
['pass1', 'pass2', 'pass3']
['email1, 'email2', 'email3']
但我得到的是:

['user1', 'user2', 'user3']
[]
[]

一旦这样做成功,我还需要一种方法将它写回.csv,它的格式与我调用它时的格式完全相同,但添加了信息,以便在需要时可以再次调用它。

您试图通过反复调用
csv.reader(f)
来使用csv文件三次

您可以将行存储在临时列表中,并从该列表中获取列

with open('userdata.csv', 'r') as f:
    rows = list(csv.reader(f))
    userlist = [row[0] for row in rows]
    passlist = [row[1] for row in rows]
    emaillist = [row[2] for row in rows]
从行中选择列的更优雅的方法是使用
zip

with open('userdata.csv', 'r') as f:
    userlist, passlist, emaillist = zip(*(row for row in csv.reader(f)))
要写入csv文件,可以在另一个方向使用
zip
,将列转换回行:

with open('output.csv', 'w', newline='') as f:
    csv.writer(f).writerows(zip(userlist, passlist, emaillist))

您通过反复调用
csv.reader(f)
尝试使用csv文件三次

您可以将行存储在临时列表中,并从该列表中获取列

with open('userdata.csv', 'r') as f:
    rows = list(csv.reader(f))
    userlist = [row[0] for row in rows]
    passlist = [row[1] for row in rows]
    emaillist = [row[2] for row in rows]
从行中选择列的更优雅的方法是使用
zip

with open('userdata.csv', 'r') as f:
    userlist, passlist, emaillist = zip(*(row for row in csv.reader(f)))
要写入csv文件,可以在另一个方向使用
zip
,将列转换回行:

with open('output.csv', 'w', newline='') as f:
    csv.writer(f).writerows(zip(userlist, passlist, emaillist))

回答得很好,真的很有帮助。还有一个问题,是否有一种“更优雅”的方式可以在一行中追加3次?您的意思是对每一列执行
userlist=userlist+('user4',)
?这会起作用,但我认为它既不优雅也不可读:
row=userlist,passlist,emaillist=tuple(map(lambda x,y:x+(y,),(userlist,passlist,emaillist),('user4','pass4','email4'))
只对行进行操作可能更好,即
rows=list(csv.reader(f))
。然后,行添加将像
行那样简单。append(['user4','pass4','email4'])
。在这种情况下,您甚至不需要上面的
zip
s。为什么我不需要这个zip?这难道不只是将项目添加到列表中,而不是实际将它们写入文件吗?如果您使用
rows=list(csv.reader(input_file))
读取行,并且只将其余代码写入使用
行的行,这意味着您没有使用
userlist
passlist
emaillist
,那么您就可以使用
,然后,您可以使用
csv.writer(f).writerows(rows)
将其写入一个文件。非常抱歉,我的代码中的其他地方出现了一个错误,导致了这个问题。请回答,非常有用。还有一个问题,是否有一种“更优雅”的方式可以在一行中追加3次?您的意思是对每一列执行
userlist=userlist+('user4',)
?这会起作用,但我认为它既不优雅也不可读:
row=userlist,passlist,emaillist=tuple(map(lambda x,y:x+(y,),(userlist,passlist,emaillist),('user4','pass4','email4'))
只对行进行操作可能更好,即
rows=list(csv.reader(f))
。然后,行添加将像
行那样简单。append(['user4','pass4','email4'])
。在这种情况下,您甚至不需要上面的
zip
s。为什么我不需要这个zip?这难道不只是将项目添加到列表中,而不是实际将它们写入文件吗?如果您使用
rows=list(csv.reader(input_file))
读取行,并且只将其余代码写入使用
行的行,这意味着您没有使用
userlist
passlist
emaillist
,那么您就可以使用
,然后,您可以使用
csv.writer(f).writerows(rows)
将其写入一个文件。非常抱歉,我的代码中有一个错误导致了此问题