Python - CSV - Добавление элементов в конец каждой строки в файле CSV
Я пытаюсь написать код, который записывает файл CSV, который имеет 1 строку заголовка и 20 других строк, каждая из которых содержит следующее: 1 случайное имя, 8 оценок [случайно сгенерированные] и 1 итоговая оценка, усредненная по другим 8 случайных оценок. Я дошел до того, что прочитал файл, сгенерировал средние итоговые оценки и добавил его в пустой список, чтобы я мог повторно ввести его в файл, но у меня возникают проблемы при записи / добавлении их обратно в файл.
Я вижу что нет x.writecolumns()
и у меня много проблем, пытаясь выполнить этот шаг. Вот что у меня так далеко. Заранее спасибо всем, кто заходит, чтобы дать совет по этому вопросу.
import random
import csv
fname = ['Red', 'Jose', 'Mikasa', 'Sakura', 'Naruto', 'Momoka', 'Zero', 'Ryu', 'Ken', 'Geralt', 'Greg', 'Mika', 'Momo',
'Xenovia', 'John', 'Gary', 'Lance', 'Eren', 'Duke', 'Claire']
lname = ['Akerman', 'Haruno', 'Johnson', 'Rivia', 'Valentine', 'Redfield', 'Kennedy', 'Juarez', 'Jameson', 'Williams',
'Miller', 'Davis', 'Thompson', 'Garcia', 'Remington', 'Hayabusa', 'Strife', 'Armstrong', 'Kojima', 'Chambers']
avg_list = list()
#^List where im appending all the average grades for all students
def ranint():
value = random.randint(60, 100)
return value
#^random value generator
def ranname():
first = random.choice(fname)
last = random.choice(lname)
fname.remove(first)
lname.remove(last)
return ("; ".join([first, last]))
#^picks a random first name and random last name
#CSV writer that has 1 header row and 20 other rows, each consisting of 1 name, 8 random grades, and 1 final grade averaged from the other 8
with open('grades2.csv', 'w', newline='') as fp:
a = csv.writer(fp, delimiter=',')
data = [['Name', 'If Else', 'Loops', 'Functions', 'File IO', 'Conditionals', 'Repetition', 'Python Functions',
'Input Output', 'Grade'],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()]]
a.writerows(data)
fp.close()
#Reads the file, sums all 8 grades and gets the average. Does this for all students and then appends the results to a empty list
with open('grades2.csv', 'r+', newline='') as fh:
z = csv.reader(fh)
next(z) #skip the header
for row in z:
integers = [int(i) for i in row[1:9]]
avg_integers = sum(integers) / len(integers)
avg_list.append(avg_integers)
print(avg_integers) #This is just here to check with the final CSV file
fh.close()
1 ответ
Я полагаю, что единственным вариантом здесь является создание списка всех данных строк с усредненными оценками, затем очистка содержимого файла и повторная запись в CSV. Посмотрите код ниже, который выполняет это:
import random
import csv
fname = ['Red', 'Jose', 'Mikasa', 'Sakura', 'Naruto', 'Momoka', 'Zero', 'Ryu', 'Ken', 'Geralt', 'Greg', 'Mika', 'Momo',
'Xenovia', 'John', 'Gary', 'Lance', 'Eren', 'Duke', 'Claire']
lname = ['Akerman', 'Haruno', 'Johnson', 'Rivia', 'Valentine', 'Redfield', 'Kennedy', 'Juarez', 'Jameson', 'Williams',
'Miller', 'Davis', 'Thompson', 'Garcia', 'Remington', 'Hayabusa', 'Strife', 'Armstrong', 'Kojima', 'Chambers']
avg_list = list()
#^List where im appending all the average grades for all students
def ranint():
value = random.randint(60, 100)
return value
#^random value generator
def ranname():
first = random.choice(fname)
last = random.choice(lname)
fname.remove(first)
lname.remove(last)
return ("; ".join([first, last]))
#^picks a random first name and random last name
#CSV writer that has 1 header row and 20 other rows, each consisting of 1 name, 8 random grades, and 1 final grade averaged from the other 8
with open('C:/react/learnnextjs-demo/pages/grades2.csv', 'w', newline='') as fp:
a = csv.writer(fp, delimiter=',')
data = [['Name', 'If Else', 'Loops', 'Functions', 'File IO', 'Conditionals', 'Repetition', 'Python Functions',
'Input Output', 'Grade'],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint()]]
a.writerows(data)
fp.close()
#Reads the file, sums all 8 grades and gets the average. Does this for all students and then appends the results to a empty list
with open('grades2.csv', 'r+', newline='') as fh:
reader = csv.reader(fh)
next(reader) #skip the header
allRows = []
for row in reader:
integers = [int(i) for i in row[1:9]]
avg_integers = sum(integers) / len(integers)
row.append(avg_integers) #This is just here to check with the final CSV file
allRows.append(row)
fh.close()
with open('grades2.csv', "w+", newline='') as fw:
writer = csv.writer(fw)
writer.writerows(allRows)
fw.close()