2017-01-13 4 views
1

У меня есть вопрос о моем коде:Как сохранить содержимое списка в файл?

def entry_book(): 
    book = ["autor", "ime", "godina", "ISNB", "zanr", "cena", "broj"] 
    print ("Podaci za knjigu:") 
    book[0] = input ("Autor: ") 
    book[1] = input ("Naslov: ") 
    book[2] = input ("Godina: ") 
    book[3] = input ("ISNB: ") 
    book[4] = input ("Zanr: ") 
    book[5] = input ("Cena: ") 
    book[6] = input ("Kolicina: ") 
    record= "{}|{}|{}|{}|{}|{}|{}".format (book[0], book[1], book[2], book[3], 
              book[4], book[5], book[6]) 

    print (book) 
    print (record) 
    f = open('books.txt','w') 
    f.write (record) 
    f.close() 
    f = open("books.txt") 
    x = f.read() 
    f.close() 
    print (x) 
    record1 = record.split('|') 
    print (record1) 

    second_meni() 

Это код для хранения информации о книгах, которые я хочу получить доступ позже (например, в библиотеке). Тем не менее, каждый раз, когда я добавляю/создаю новую книгу, старый удаляется. Может ли кто-нибудь помочь мне переписать код, чтобы он мог хранить старые данные. Или, пожалуйста, объясните, как правильно это сделать?

+4

Наличие кода на английском помогает. Просто FYI в следующий раз. –

+4

'f = open ('knjige.txt', 'w')': он каждый раз перезаписывает файл (обрезает) –

+1

Честно говоря, вам действительно нужно посетить этот бесплатный курс python в кодекадемии и т. Д., Чтобы запрограммировать это правильно. – mootmoot

ответ

6

Вы должны использовать

f = open('knjige.txt', 'a') 

«ш» воссоздает файл (так что используйте его только для новых файлов, или если вы не возражаете, то он будет перезаписан, «а» добавляет к файлу.

См python open built-in function: difference between modes a, a+, w, w+, and r+?

Также некоторые несвязанных предложений:

  • Используйте надстройку вместо индексов, или даже лучше: используйте словарь
  • Используйте английские имена/комментарии переменных.
  • Используйте код, чтобы проверить, нормально ли чтение/запись файла, что делать, если файл не может быть написан из-за ограничений доступа или слишком меньше места на диске?
  • Используйте различные функции для ввода, записи и печати, что облегчает тестирование/ремонтопригодность/расширение.
+0

Спасибо. Это помогло. Но если я могу задать еще один вопрос, как создать его, чтобы каждый раз, когда я вводил новую книгу (список), она сохранялась в новой строке в текстовом файле. – Alex

+1

«Как создать его так, чтобы каждый раз, когда я вводил новую книгу (список), она сохранялась в новой строке в текстовом файле»: вы должны добавить символ новой строки в свою выходную строку '\ n'. –

+0

(уже ответили выше) –

0

Ваш звонок для открытия файла, f = open('knjige.txt','w') открывает файл, обрезая существующее содержимое, если оно существует. Если вы откроете файл с режимом, который добавляет содержимое, например a, он не должен удалять предыдущие строки. См. https://docs.python.org/2/library/functions.html#open для получения дополнительной информации об открытии файлов для чтения/записи.

2

Я поместил pythonizing ваш код немного.

def unos_knjiga(): 
    headers = ["Autor", "Naslov", "Godina", "ISNB", "Zanr", "Cena", "Kolicina"] 
    print("Podaci za knjigu:") 
    knjiga = [input("{}".format(obj + ': ')) for obj in headers] # see 1 
    zapis = '|'.join(knjiga) # see 2 

    print(knjiga) 
    print(zapis) 

    with open('knjige.txt', 'a') as f: # see 3 
     f.write(zapis + '\n') 

    # i guess this is for testing? 
    with open("knjige.txt", 'r') as f: 
     x = f.read() 
    print(x) 

    # and this too? 
    zapis1 = zapis.split('|') 
    print(zapis1) 

    # this is not mentioned anywhere 
    second_meni() 

1) Это список понимание. Он создает списки, перебирая вещи. В этом случае мы перебираем список header и используем его элементы для построения операторов input. Предоставленный вход сохраняется в списке.

2) .join() способ. Он делает то, что вы явно делали. Объединение элементов из итераторов с использованием строки между ними.

3) ключевое слово with. Управляет файлами, поэтому вам не нужно. Если есть причина не использовать его, используйте его. Это было также, где была реальная проблема с вашим кодом. Вы должны использовать режим 'a'. 'a' для append, 'w' для записи. В этом контексте напишите средства удалить все, что было там, и написать новый материал. Также обратите внимание, что режим 'a' также может создавать файлы, вам не нужно временно переключаться на 'w' за это ('r' не: 'r' для , читается).

Cheers!

+0

Спасибо. это часть моей программы, в которой у меня была проблема. Im эпический новичок в этом все еще:/ – Alex

+0

@Alex: код уже добавляет '\ n', который разделяет ваши книги на отдельные строки. – mootmoot

+0

@mootmoot благодарит столько людей, что он отлично работает! – Alex

1

Я думаю, что есть два способа сделать это:

ПЕРВЫЕ

f = open('knjige.txt','w') 

является кусок кода, который отвечает за перезапись существующих данных в файле. Другой вариант, который python предлагает добавить некоторые новые данные в существующие данные, - это открыть файл для записи, используя метод append 'a'. Таким образом, вы можете заменить свой вышестоящий отчет на

f = open('knjige.txt','a') 

Он не заменит файл новыми данными, которые вы вводите.

ВТОРОЙ

Другой вариант, чтобы открыть файл в методе чтения, f = open('knjige.txt','r') и скопировать существующие данные в переменную (variable=f.read('knjige.txt')). Вы также можете использовать pickle module и его функции dump и загрузить, если вам нужно сохранить свой тип данных. Теперь соедините ваши новые данные с значениями в 'variable' и снова откройте файл в методе write и запишите его обратно.

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