第二次写入文件的问题,Python3

时间:2018-09-06 08:38:12

标签: python

我已经使用tkinkerPython 3.6创建了电话簿 当我在电话簿中添加人员时,它将保存到文件中。

当我再次加载程序时,它会按原样加载文件。 如果我在第一次运行时添加2个人,则一切正常。 第二轮,我添加了一个人,它在索引1处添加了一个空行,并按需要添加了下面的人。 第三轮,我添加了一个人,它在索引1处添加了新行,并在列表中最后一个人。 现在我得到2空行。

我不知道为什么它会在索引1处创建一个空白空间。它不应该这样做。

这里是代码,注释用瑞典语表示,对此感到抱歉。

函数lägg_till()中如何写入文件 首次运行时,它将自动创建kontakter.txt。 “Läggtill”表示在瑞典添加,“ Avsluta”退出该程序。

from tkinter import *
import os.path


root = Tk()
root.geometry("640x640+200+100")
root.title("Telefon listan")

def avsluta():
    quit()

def spara():
    #Spara kontakter till fil.
    name = entry_1.get()
    mobil = entry_2.get()
    if name == "" or mobil == "" :
        pass
    else:
        with open("kontakter.txt","w") as file:
            file.write("\n".join(kontakter.get(0,END)))

def ta_bort():
    # Ta bort kontakter,genom att välja index av element och sparar värdet i variabel index.
    index = kontakter.curselection()
    print(index)
    kontakter.delete(index)

def lägg_till():
    # Ta inmatade värden från name,mobil och spara i kontakter.
    # Använder .get() för att hämta
    name = entry_1.get()
    mobil = entry_2.get().replace(" ", "") # Använder replace för att rensa whitespace
    # Varning när alla värden inte är ifyllda
    if name == "" or mobil == "" :
        label_error.config(text="Alla fälten är inte ifyllda")

    else:
    # trycka in dessa i kontakter med .insert() END för slutet av listan, dvs index "kan vara 0,1,2,3"
        #Rensar error fältet innan man lägger till kontakten
        label_error.config(text="")
        kontakter.insert(END,name + " - " + mobil)
        # Rensa fältet efter lägg till
        entry_1.delete(0,END)
        entry_2.delete(0,END)
        kontakt = kontakter.get(0,END)
        with open("kontakter.txt","w") as file:
            file.write("\n".join(kontakt))


def uppdatera():
    # Hämta det markerade data
    index = kontakter.curselection()
    name = entry_1.get()
    mobil = entry_2.get()
    # Varning när alla värden inte är ifyllda
    if name == "" or mobil == "" :
        label_error.config(text="Alla fälten är inte ifyllda")
    else:
        # trycka in dessa i kontakter med .insert() END för slutet av listan, dvs index "kan vara 0,1,2,3"
        #Rensar error fältet innan man lägger till kontakten
        label_error.config(text="")
        # Raderar det ifyllda data
        kontakter.delete(index)
        #Skriver nytt
        kontakter.insert(index,name + "-" + mobil)
        entry_1.delete(0,END)
        entry_2.delete(0,END)

# Skapar frame
#Namn
fram_1 = Frame(root)
fram_1.pack()
#Mobil
fram_2 = Frame(root)
fram_2.pack()
#Knappar
fram_3 = Frame(root)
fram_3.pack()
# Listbox
fram_4 = Frame(root)
fram_4.pack()

#Skapar label
#Namn
label_1 = Label(fram_1,text="Name:")
label_1.grid(row=0, column=0)
#Mobil
label_2 = Label(fram_2,text="Mobil:")
label_2.grid(row=1,column=0)


# Skapar entry
#namn
entry_1 = Entry(fram_1)
entry_1.grid(row=0,column=1)
#Mobil
entry_2 = Entry(fram_2)
entry_2.grid(row=1,column=2,)

# Kolla om filen finns, annars skapa den, behöver importera os.path
if not os.path.exists("kontakter.txt"):
    open('kontakter.txt', 'w').close()
else:
    pass


# Läsa från fil
data = []
with open("kontakter.txt" ,"r") as fil:
    for line in fil:
        data += [line]


# Listbox
kontakter = Listbox(fram_4,height=8,width=40,bg="pink")
kontakter.grid(row=0,column=0)
# Lägger till kontakter , första värdet är index följt av värde,
kontakter.insert(END,)

#Läsa in från fil
for i in range(len(data)):
    kontakter.insert(i+0 , data[i])

# Error
label_error = Label(root,text="",fg="red")
label_error.pack()

# Knappar
# knapp Lägg till
button_1 = Button(fram_3,text="Lägg till",command=lägg_till)
button_1.grid(row=0,column=0)
# knapp edit
button_2 = Button(fram_3,text="Uppdatera",command=uppdatera)
button_2.grid(row=0,column=1)
# Knapp delete
button_3 = Button(fram_3,text="Radera",command=ta_bort)
button_3.grid(row=0,column=2)
# Knapp avsluta
button_4 = Button(fram_3,text="Avsluta",command=avsluta)
button_4.grid(row=0,column=3)
button_5 = Button(fram_3,text="Spara",command=spara)
button_5.grid(row=0,column=4)


root.attributes("-topmost", True)
root.mainloop()

3 个答案:

答案 0 :(得分:0)

lägg_till()内部,当您打开文件时,请使用ab而不是w

with open("kontakter.txt","ab") as file:
        file.write("\n".join(kontakt))

答案 1 :(得分:0)

通过添加.strip(),我做了解决方法,但是我认为问题仍然存在。

# Läsa från fil
data = []
with open("kontakter.txt" ,"r") as fil:
    for line in fil.readlines():
        data += [line.strip()] #.strip() fix the problem
    fil.close()

答案 2 :(得分:0)

程序中的问题是kontakt = kontakter.get(0,END),它会按如下所示返回数据:

('1 - 1\n', '2 - 2', '3 - 3')

请注意,第三次输入(3 - 3)是在GUI关闭一次之后进行的。通过与'\n'.join()一起加入,您将获得一个额外的空格字符:

'1 - 1\n\n2 - 2\n3 - 3\n'

我不知道为什么只有在关闭程序一次后才会发生这种情况的确切原因。

您可以通过使用“ a”而不是“ w”来避免这种冲突,只需在文本文件中附加字符串即可。

with open("kontakter.txt","a") as file:
    file.write(name + " - " + mobil + '\n')