#python #csv
#python #csv
Вопрос:
Я пытаюсь выучить python, я написал код для преобразования списка повторяющихся кортежей в csv. Я не могу получить нужный мне результат
Имена строк должны быть динамическими независимо от того, сколько когда-либо было плодов.
import csv
csvData = [('apple', '2'), ('banana', '10'), ('apple', '21'), ('banana', '24'),('pears','10'),('pears','30')]
with open('person.csv', 'w') as csvFile:
writer = csv.writer(csvFile)
writer.writerows(csvData)
csvFile.close()][1]][1]
Я получаю вывод следующим образом
Вместо этого я хочу, чтобы результат выглядел следующим образом
Ответ №1:
Чтобы получить желаемый результат, вам нужно преобразовать ваш ввод в
csvData = [('apple', '2'), ('banana', '10'), ('apple', '21'),
('banana', '24'), ('pears','10'),('pears','30')]
использование python для списка, структурированного следующим образом:
new_data = [('apple', 'banana', 'pears'), # row 0
('2','10','10'), # row 1
('21','24','30')] # row 2 of your outputfile
Если вы передадите это в
import csv
with open("fruits.csv", "w", newline ="" ) as csvFile:
writer = csv.writer(csvFile)
writer.writerows(new_data)
print(open("fruits.csv").read())
Вы получаете желаемый результат:
apple,banana,pears 2,10,10 21,24,30
Вам нужно добавить newline =""
к вашему вызову, чтобы избежать сбоев.
Чтобы переформатировать произвольный ввод кортежей, вы можете использовать это:
Решение на Python 3.6:
from itertools import zip_longest
import csv
data = [('apple', '2'), ('banana', '10'), ('apple', '21'),
('banana', '24'), ('pears','10'),('pears','30'),
('banana', '24'), ('banana','3000')]
# convert data into dictionary - use collections.defaultdict if speed is a problem
d = {}
for key,value in data:
d.setdefault(key,[]).append(value)
# transpose to output format
outdata = zip_longest(*( [k] i for k,i in d.items() ),"")
with open("fruits.csv", "w", newline ="" ) as csvFile:
writer = csv.writer(csvFile)
writer.writerows(outdata)
Выходной файл:
apple,banana,pears,
2,10,10,
21,24,30,
,24,,
,3000,,
Doku:
Python 2.7 — нет zip_longest в itertools:
import csv
data = [('apple', '2'), ('banana', '10'), ('apple', '21'),
('banana', '24'), ('pears','10'),('pears','30'),
('banana', '24'), ('banana','3000')]
# convert data into dictionary - use collections.defaultdict if speed is a problem
d = {}
for key,value in data:
d.setdefault(key,[]).append(value)
# get longest list value to fill up shorter ones
longest = len(max(d.values(), key=len))
kr = []
# build up column sublists with empty filler lists
for key in d:
kr.append([key])
kr[-1].extend(d[key])
addon = longest - len(d[key])
if addon:
kr[-1].extend( [""]* addon)
# transpose columns into rows
outdata = zip(*kr)
with open("fruits.csv", "w") as csvFile:
writer = csv.writer(csvFile)
writer.writerows(outdata)
print(open("fruits.csv").read())
Комментарии:
1. Хотя я согласен, что SO не предназначен для выполнения чьей-либо домашней работы, имхо опубликованный ответ должен решить проблему. В вашем ответе не показано, как группировать значения.
2. что, если порядок кортежей изменится?
3. @user9538877 Вам нужно создать список кортежей строк (или списков), которые вы вводите в csv.writerows(). Если ваши данные изменятся, вам нужно расположить правильные числа позиционно друг над другом.
4. @Scotty1- в его вопросе не возникает никаких проблем с перестановкой чего-либо, в нем просто указаны входные данные, выходные данные и требуемый результат. Мой ответ предоставляет структуру, необходимую для достижения этого результата.
5. Нет проблем, спасибо