如何在末尾没有 \n 的情况下读取行? (python)
How to readlines without having the \n at the end? (python)
当我完成我制作的游戏时,我制作了一个保存到文件的保存按钮。当游戏打开时,它会读取文件并将这些行保存为变量。我这样做了,但后来我发现它需要是一个整数,所以我使用 int()
。但是这样就不行了,因为变量是"0\n"
而不是"0"
。我检查了很多其他问题,但他们没有问或回答相同的问题。
所以我想知道,有没有办法在最后没有 \n
的情况下 readlines()
?或者有什么方法可以自动退格变量?这是我的代码:
import tkinter as tk
from PIL import Image, ImageTk
# --- functions ---
def eggvalue_change():
global eggvalue, eggvalueupgrade, money, eggz
if money > int(round(eggvalueupgrade)):
eggz -= eggvalueupgrade / eggvalue
eggvalue+=0.2
eggvalueupgrade += int(round(eggvalueupgrade + (eggvalueupgrade / 7)))
def moar_eggz():
global eggzps, chookz
chookz += 1
def saving():
savedfile.write(money)
savedfile.write(eggvalueupgrade)
savedfile.write(eggzps)
savedfile.write(chookz)
savedfile.write(eggvalue)
savedfile.write(eggz)
def main_loop():
global eggz, eggzps, money
eggzps = chookz / 100.0
money = eggz * eggvalue
try:
openbutton2.config( text="Egg Value: " + str(eggvalue) + " --> " + str(eggvalue+0.2) + " ($" + str(eggvalueupgrade) + ")", command=eggvalue_change)
label2.config(text="Money: $" + str(int(round(money))), font=("Terminal", 50), borderwidth=5, relief="ridge", bg="black", foreground="white",pady=10, padx=498)
if eggzps >= 10:
label1.config(text="| Chickens: " + str(chookz)+" | Eggs: " + str(int(round(eggz)))+" | Eggs Per Second: " + str(int(round(eggzps)))+" | Egg Value: $" + str(eggvalue) + " |", font=("Terminal", 20), borderwidth=4, relief="ridge", bg="black", foreground="red",pady=10, padx=498)
elif eggzps < 10:
label1.config(text="| Chickens: " + str(chookz)+" | Eggs: " + str(int(round(eggz)))+" | Eggs Per Second: " + str(eggzps)+" | Egg Value: $" + str(eggvalue)+ " |", font=("Terminal", 20), borderwidth=4, relief="ridge", bg="black", foreground="red",pady=10, padx=498)
if money < int(round(eggvalueupgrade)):
openbutton2.config(fg="gray")
elif money > int(round(eggvalueupgrade)):
openbutton2.config(fg="white")
except Exception as e:
print(e) # display exception to see problem
root.after(20, main_loop)
def update_eggz():
global eggz
try:
eggz += eggzps
except Exception as e:
print(e) # display exception to see problem
# repeat it after 1000ms
root.after(1000, update_eggz)
# --- main ---
root = tk.Tk()
root.title("Chicken Clicker")
savedfile = open("savedata\mainsave.txt", "a+")
savedlines = savedfile.readlines()
print savedlines
if savedlines == []:
eggz = 0
eggvalue = 0.2
chookz = 0
eggzps = 0.0
eggvalueupgrade = 100
money = eggz * eggvalue
eggz = int(savedlines[0])
eggvalue = int(savedlines[1])
chookz = int(savedlines[2])
eggzps = int(savedlines[3])
eggvalueupgrade = int(savedlines[4])
money = int(savedlines[5])
savedfile.close()
# empty labels - `update_labels` will add text
label2 = tk.Label(root)
label1 = tk.Label(root)
label2.pack()
label1.pack()
chickencnv = Image.open("img\1.png")
chicken = ImageTk.PhotoImage(chickencnv)
openbutton3 =tk.Button(root, bg="black", fg="white", font=("Terminal", 13), command=saving)
openbutton2= tk.Button(root, bg="black", fg="gray", font=("Terminal", 15))
openbutton1= tk.Button(root, image=chicken, width=500, height=500, command=moar_eggz, bg="black")
openbutton1.pack()
openbutton2.pack()
openbutton3.pack()
# run it first time at once
update_eggz()
main_loop()
root.mainloop()
如果没有答案,我可以接受你的评论或回答。
首先,您的代码存在逻辑错误。
if savedlines == []:
eggz = 0
eggvalue = 0.2
chookz = 0
eggzps = 0.0
eggvalueupgrade = 100
money = eggz * eggvalue
eggz = int(savedlines[0])
eggvalue = int(savedlines[1])
chookz = int(savedlines[2])
eggzps = int(savedlines[3])
eggvalueupgrade = int(savedlines[4])
money = int(savedlines[5])
您检查 savedlines
是否为空列表并相应地设置一些值。但是,如果这是真的,以下行将失败并显示 IndexError
,因为您的列表是空的。您需要将其更改为:
if savedlines == []:
eggz = 0
eggvalue = 0.2
chookz = 0
eggzps = 0.0
eggvalueupgrade = 100
money = eggz * eggvalue
else:
eggz = int(savedlines[0])
eggvalue = int(savedlines[1])
chookz = int(savedlines[2])
eggzps = int(savedlines[3])
eggvalueupgrade = int(savedlines[4])
money = int(savedlines[5])
现在,来解答一下这个问题。行后:
savedlines = savedfile.readlines()
您应该添加以下行,该行将从行尾删除 \n
:
savedlines = [line.rstrip("\n") for line in savedlines]
In [17]: fff = open('/somefile', 'r')
In [18]: ss = fff.readlines()
In [19]: ss
Out[19]: ['qqq\n', 'www\n', 'aaa\n']
In [20]: ss = [ww.strip('\n') for ww in ss]
In [21]: ss
Out[21]: ['qqq', 'www', 'aaa']
当我完成我制作的游戏时,我制作了一个保存到文件的保存按钮。当游戏打开时,它会读取文件并将这些行保存为变量。我这样做了,但后来我发现它需要是一个整数,所以我使用 int()
。但是这样就不行了,因为变量是"0\n"
而不是"0"
。我检查了很多其他问题,但他们没有问或回答相同的问题。
所以我想知道,有没有办法在最后没有 \n
的情况下 readlines()
?或者有什么方法可以自动退格变量?这是我的代码:
import tkinter as tk
from PIL import Image, ImageTk
# --- functions ---
def eggvalue_change():
global eggvalue, eggvalueupgrade, money, eggz
if money > int(round(eggvalueupgrade)):
eggz -= eggvalueupgrade / eggvalue
eggvalue+=0.2
eggvalueupgrade += int(round(eggvalueupgrade + (eggvalueupgrade / 7)))
def moar_eggz():
global eggzps, chookz
chookz += 1
def saving():
savedfile.write(money)
savedfile.write(eggvalueupgrade)
savedfile.write(eggzps)
savedfile.write(chookz)
savedfile.write(eggvalue)
savedfile.write(eggz)
def main_loop():
global eggz, eggzps, money
eggzps = chookz / 100.0
money = eggz * eggvalue
try:
openbutton2.config( text="Egg Value: " + str(eggvalue) + " --> " + str(eggvalue+0.2) + " ($" + str(eggvalueupgrade) + ")", command=eggvalue_change)
label2.config(text="Money: $" + str(int(round(money))), font=("Terminal", 50), borderwidth=5, relief="ridge", bg="black", foreground="white",pady=10, padx=498)
if eggzps >= 10:
label1.config(text="| Chickens: " + str(chookz)+" | Eggs: " + str(int(round(eggz)))+" | Eggs Per Second: " + str(int(round(eggzps)))+" | Egg Value: $" + str(eggvalue) + " |", font=("Terminal", 20), borderwidth=4, relief="ridge", bg="black", foreground="red",pady=10, padx=498)
elif eggzps < 10:
label1.config(text="| Chickens: " + str(chookz)+" | Eggs: " + str(int(round(eggz)))+" | Eggs Per Second: " + str(eggzps)+" | Egg Value: $" + str(eggvalue)+ " |", font=("Terminal", 20), borderwidth=4, relief="ridge", bg="black", foreground="red",pady=10, padx=498)
if money < int(round(eggvalueupgrade)):
openbutton2.config(fg="gray")
elif money > int(round(eggvalueupgrade)):
openbutton2.config(fg="white")
except Exception as e:
print(e) # display exception to see problem
root.after(20, main_loop)
def update_eggz():
global eggz
try:
eggz += eggzps
except Exception as e:
print(e) # display exception to see problem
# repeat it after 1000ms
root.after(1000, update_eggz)
# --- main ---
root = tk.Tk()
root.title("Chicken Clicker")
savedfile = open("savedata\mainsave.txt", "a+")
savedlines = savedfile.readlines()
print savedlines
if savedlines == []:
eggz = 0
eggvalue = 0.2
chookz = 0
eggzps = 0.0
eggvalueupgrade = 100
money = eggz * eggvalue
eggz = int(savedlines[0])
eggvalue = int(savedlines[1])
chookz = int(savedlines[2])
eggzps = int(savedlines[3])
eggvalueupgrade = int(savedlines[4])
money = int(savedlines[5])
savedfile.close()
# empty labels - `update_labels` will add text
label2 = tk.Label(root)
label1 = tk.Label(root)
label2.pack()
label1.pack()
chickencnv = Image.open("img\1.png")
chicken = ImageTk.PhotoImage(chickencnv)
openbutton3 =tk.Button(root, bg="black", fg="white", font=("Terminal", 13), command=saving)
openbutton2= tk.Button(root, bg="black", fg="gray", font=("Terminal", 15))
openbutton1= tk.Button(root, image=chicken, width=500, height=500, command=moar_eggz, bg="black")
openbutton1.pack()
openbutton2.pack()
openbutton3.pack()
# run it first time at once
update_eggz()
main_loop()
root.mainloop()
如果没有答案,我可以接受你的评论或回答。
首先,您的代码存在逻辑错误。
if savedlines == []:
eggz = 0
eggvalue = 0.2
chookz = 0
eggzps = 0.0
eggvalueupgrade = 100
money = eggz * eggvalue
eggz = int(savedlines[0])
eggvalue = int(savedlines[1])
chookz = int(savedlines[2])
eggzps = int(savedlines[3])
eggvalueupgrade = int(savedlines[4])
money = int(savedlines[5])
您检查 savedlines
是否为空列表并相应地设置一些值。但是,如果这是真的,以下行将失败并显示 IndexError
,因为您的列表是空的。您需要将其更改为:
if savedlines == []:
eggz = 0
eggvalue = 0.2
chookz = 0
eggzps = 0.0
eggvalueupgrade = 100
money = eggz * eggvalue
else:
eggz = int(savedlines[0])
eggvalue = int(savedlines[1])
chookz = int(savedlines[2])
eggzps = int(savedlines[3])
eggvalueupgrade = int(savedlines[4])
money = int(savedlines[5])
现在,来解答一下这个问题。行后:
savedlines = savedfile.readlines()
您应该添加以下行,该行将从行尾删除 \n
:
savedlines = [line.rstrip("\n") for line in savedlines]
In [17]: fff = open('/somefile', 'r')
In [18]: ss = fff.readlines()
In [19]: ss
Out[19]: ['qqq\n', 'www\n', 'aaa\n']
In [20]: ss = [ww.strip('\n') for ww in ss]
In [21]: ss
Out[21]: ['qqq', 'www', 'aaa']