Python Pickle文件权限
我是python新手,正在尝试编写一个程序来跟踪金额、数字或其他信息。您可以添加或减去您的金额,并将其保存到文件中,或者检查您当前拥有的金额。我让它用这个代码工作Python Pickle文件权限,python,python-3.x,pickle,Python,Python 3.x,Pickle,我是python新手,正在尝试编写一个程序来跟踪金额、数字或其他信息。您可以添加或减去您的金额,并将其保存到文件中,或者检查您当前拥有的金额。我让它用这个代码工作 import pickle num = 0 toDo = input("would you like to load or add/subtract? ") if toDo == "add": a = float(input("How much do you want to add? ")) pic
import pickle
num = 0
toDo = input("would you like to load or add/subtract? ")
if toDo == "add":
a = float(input("How much do you want to add? "))
pickle_in = open("Python", "rb")
newNum = pickle.load(pickle_in)
newNum = newNum + a
print("Current balance:", newNum)
pickle_out = open("Python","wb")
pickle.dump(newNum, pickle_out)
pickle_out.close()
if toDo == "subtract":
a = float(input("How much do you want to subtract? "))
pickle_in = open("Python", "rb")
newNum = pickle.load(pickle_in)
newNum = newNum - a
print("Current balance:", newNum)
pickle_out = open("Python","wb")
pickle.dump(newNum, pickle_out)
pickle_out.close()
if toDo == "load":
pickle_in = open("Python", "rb")
newNum = pickle.load(pickle_in)
print("Current balance:", newNum)
这工作正常,文件加载正常,一切都很好,直到今天(大约24小时后),我再次尝试运行此程序,试图加载当前数量,但它给了我以下错误:
Traceback (most recent call last):
File "C:\Users\Dom\Desktop\amount.py", line 34, in <module>
pickle_in = open("Python", "rb")
PermissionError: [Errno 13] Permission denied: 'Python'
似乎我使用chmod解决了权限问题,但在尝试加载、添加或删除时出现了此错误
Traceback (most recent call last):
File "C:\Users\Dom\Desktop\amount.py", line 11, in <module>
pickle_in = os.chmod("Python", "rb")
TypeError: an integer is required (got type str)
回溯(最近一次呼叫最后一次):
文件“C:\Users\Dom\Desktop\amount.py”,第11行,在
pickle_in=os.chmod(“Python”、“rb”)
TypeError:需要一个整数(获取类型str)
不确定我是否没有正确使用chmod函数或什么。有人能告诉我如何修复此问题和/或它停止工作的原因吗?不要自动更改权限。这既没有帮助也没有必要 首先,解决您当前的权限问题。您可以从使用另一个名称开始,而不是使用
“Python”
,这与您的应用程序完全无关,并且可能与Python二进制文件混淆。“金额.存储”怎么样?如有必要(且仅在必要时,默认情况下并非如此),使用ls
和chmod
(在命令行中,而不是在程序中)来排序权限。如果你需要这方面的帮助。您可以使用touch amount.storage
尝试创建该文件,并使用rm amount.storage
(都在命令行中,而不是在Python shell中)删除该文件
之后,确保正确打开文件。因为您已经做了很多次了,所以这样做是值得的,这样您就不需要复制和粘贴代码了。让我们从加载函数开始:
import pickle
FILENAME = "amount.storage"
def load():
with open(FILENAME, "rb") as f:
return pickle.load(f)
通过使用,即使发生错误,我们也确保关闭文件。说到错误,我们应该非常明确地处理不存在的文件。让我们添加一个:
储蓄是很容易的;以模式wb
打开:
def save(amount):
with open(FILENAME, "wb") as f:
pickle.dump(amount, f)
现在我们有了这些帮助函数,让我们在整个程序中使用它们:
import pickle
FILENAME = "amount.storage"
def load():
try:
with open(FILENAME, "rb") as f:
return pickle.load(f)
except FileNotFoundError:
return 0 # start with 0 if no storage present
def save(amount):
with open(FILENAME, "wb") as f:
pickle.dump(amount, f)
num = load()
toDo = input("would you like to load or add/subtract? ")
if toDo == "add":
a = float(input("How much do you want to add? "))
newNum = num + a
save(newNum)
elif toDo == "subtract":
a = float(input("How much do you want to subtract? "))
newNum = num - a
save(newNum)
else:
newNum = num
print("Current balance:", newNum)
请注意,通过删除复制和粘贴的所有代码,这个新程序更容易遵循,也更容易更改
除了更多操作之外,下一步还可以避免pickle,它允许任何可以写入文件的人注入任意Python代码,从而打开了一个潜在的安全漏洞。相反,你呢?您只需将上面的pickle
的三个实例替换为json
,并删除存储文件一次/name它amount.json
,因为它的当前状态将不是有效的json文件。另外一个好处是JSON是人类可读的;编码一个数字只会导致将该数字作为人类可读的字符串(仅此而已)写入文件
def save(amount):
with open(FILENAME, "wb") as f:
pickle.dump(amount, f)
import pickle
FILENAME = "amount.storage"
def load():
try:
with open(FILENAME, "rb") as f:
return pickle.load(f)
except FileNotFoundError:
return 0 # start with 0 if no storage present
def save(amount):
with open(FILENAME, "wb") as f:
pickle.dump(amount, f)
num = load()
toDo = input("would you like to load or add/subtract? ")
if toDo == "add":
a = float(input("How much do you want to add? "))
newNum = num + a
save(newNum)
elif toDo == "subtract":
a = float(input("How much do you want to subtract? "))
newNum = num - a
save(newNum)
else:
newNum = num
print("Current balance:", newNum)