Reputation: 73
I need to split a .csv file:
user1,pass1,email1
user2,pass2,email2
user3,pass3,email3
into 3 lists that can be called upon and appended too seperately.
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)
I need this code to return:
['user1', 'user2', 'user3']
['pass1', 'pass2', 'pass3']
['email1', 'email2', 'email3']
but this is what I get:
['user1', 'user2', 'user3']
[]
[]
Once this works, I also need a way to write it back as a .csv that will be in the exact format it was when I called it but with added information so it can be called again whenever needed.
Upvotes: 0
Views: 85
Reputation: 9687
You're trying to consume the csv file three times by calling csv.reader(f)
repeatedly.
You can instead store the rows in a temporary list and get columns from that list.
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]
A more elegant way of picking out columns from rows would be through the use of zip
:
with open('userdata.csv', 'r') as f:
userlist, passlist, emaillist = zip(*(row for row in csv.reader(f)))
For writing the csv file, zip
can be used in the other direction, to convert columns back to rows:
with open('output.csv', 'w', newline='') as f:
csv.writer(f).writerows(zip(userlist, passlist, emaillist))
Upvotes: 2