2017-01-13 52 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

让英文代码有帮助。下一次仅供参考。 –

+4

'f = open('knjige.txt','w')':它每次覆盖文件(截断) –

+1

老实说,你真的需要参加codeacademy等那些免费的Python课程来正确编程。 – mootmoot

回答

6

你必须使用

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

“W”重新创建文件(所以用它仅适用于新的文件,或者如果你不介意它会被覆盖,“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'用于附加,'w'用于写入。在这种情况下,写意味着删除那里的一切,并写下这个新东西。另外请注意,'a'模式也可以创建文件,因此您不需要临时切换到'w''r'没有; 'r'读取)。

干杯!

+0

谢谢。这是我的程序的一部分,我有一个问题。我仍然是一个史诗新手:/ – Alex

+0

@Alex:代码已经添加了一个'\ n',可以将你的书分成不同的行。 – mootmoot

+0

@mootmoot非常感谢,非常完美! – Alex

1

我认为有两种方法来做到这一点:

FIRST

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

是一段代码,它负责在您的文件改写现有的数据。 python提供的将一些新数据附加到现有数据的其他选项是使用append'a'方法打开一个文件进行写入。所以,你可以用

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

更换您的上述声明它不会取代您输入新数据的文件。

第二

另一种选择是在读的方法来打开你的文件,f = open('knjige.txt','r')和现有的数据复制到一个变量(variable=f.read('knjige.txt'))。您还可以使用泡菜模块及其功能转储加载如果您需要维护您的数据类型。 现在将您的新数据连接到'变量'中的值,并再次用写入方法打开文件并将其写回。

相关问题