2014-12-07 3 views
0

У меня есть код, который записывает имя пользователя + фамилию + счет в файле excel. Но я хочу, чтобы у него заголовок, например, «Имя», «Фамилия» и «Оценка» в первой строке. Затем каждый раз, когда код перезапускается, я хочу, чтобы новые данные сохранялись в новом столбце под этим заголовком.Запись строки в новую строку

+1

Просьба переставить код с некоторым отступом. Учитывая важность отступов в Python, мы только догадываемся, что ваш код должен делать, как он есть. – kdopen

+0

@kdopen извините, я не знал, как отправить его точным образом, поэтому я думал, что вам просто нужно сделать все в соответствии с текстом. Исправлено отступы. – ImYu

ответ

2

Вам нужно определить, был ли у вас уже открыт один или несколько строк, написанных ранее. Легкий способ сделать это - вызвать метод tell в файле после того, как вы открыли его в режиме добавления. tell сообщит текущую позицию в файле, которая будет завершена в режиме добавления. Вам нужно только написать заголовок, если позиция 0, так как это указывает, что файл был пуст.

if form == 'a': #if form entered is a 
    with open ('classa.csv','a',newline='') as keerthan: 
     foo = csv.writer(keerthan,delimiter=',',) 

     if keerthan.tell() == 0:      # add this test! 
      bar = ['Name', 'Surname', 'Score'] 
      foo.writerow(bar) 

     bar = [[user,surname, score]] 
     foo.writerows(bar) 

Другое дело (не связанное с вопросом заголовка файла): вы действительно должны избегать дублирования так много кода между различными if заявления. Часто вы можете использовать одну и ту же логику, используя разные значения. Вот как вы можете превратить if выше в общий фрагмент кода, который может быть использован для всех трех форм:

filename = "class{}".format(form)  # use string formatting to get the right filename 
with open (filename,'a',newline='') as keerthan: # open the file using a variable name 
    foo = csv.writer(keerthan,delimiter=',',) 

    if keerthan.tell() == 0: 
     bar = ['Name', 'Surname', 'Score'] 
     foo.writerow(bar) 

    bar = [[user,surname, score]] 
    foo.writerows(bar) 

Вы можете, вероятно, сделать что-то подобное для Q & код, с ответом и arithmatic оператора сохраняются в переменных.

+0

Благодарю вас за ответ. Теперь я понимаю, как очистить мою работу ^^. Спасибо за эту помощь, но за часть заголовка я ввел то, что вы предложили, но получил ошибку. строка 83, в if keerthan.tell() == 0: # добавить этот тест! ValueError: операция ввода-вывода в закрытом файле. P.s - Когда код будет запущен, он впервые создаст файл с именем class a, так что там ничего не будет, во второй раз он будет запускать первые данные. – ImYu

+0

Я проверил файл excel, и название, казалось, было там, но из-за того, что у меня была эта ошибка, я не думаю, что мои данные хранятся, например, имя + фамилия + оценка ниже заголовка соответственно. – ImYu

+0

Хм, эта ошибка подсказывает, что файл 'keerthan' был закрыт, прежде чем вы вызываете' tell' на нем. Вы уверены, что у вас есть отпечаток кода прямо на вашем конце? Вызов 'tell()' должен быть отступом как часть блока, следующего за символом 'with open (...) как keerthan'. Оператор 'with' автоматически закрывает файл, когда заканчивается его блок. – Blckknght

Смежные вопросы