首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Pickle文件权限

Python Pickle文件权限
EN

Stack Overflow用户
提问于 2016-05-05 10:16:15
回答 1查看 4.9K关注 0票数 1

我对python很陌生,我正试图编写一个程序来跟踪一定数量的金钱、数字或其他东西。您可以添加或减去您的金额,并将其保存到文件中,或者检查您当前的金额。我让它使用这段代码

代码语言:javascript
复制
  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小时后),我尝试再次运行这个程序,试图加载当前的金额,它给了我这个错误:

代码语言:javascript
复制
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'

然后我尝试使用os.chmod函数,但我不能100%确定我是否正确地使用了它。

代码语言:javascript
复制
import pickle
import os, sys, stat



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 = os.chmod("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 = os.chmod("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 = os.chmod("Python", "rb")
  newNum = pickle.load(pickle_in)
  print("Current balance:", newNum)

使用chmod似乎通过了权限问题,但在加载、添加或减除时,我得到了这个错误。

代码语言:javascript
复制
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)

不确定我是不是没有正确地使用chmod函数什么的。有人能告诉我如何解决这个问题和/或为什么它停止工作吗?

EN

回答 1

Stack Overflow用户

发布于 2016-05-05 10:51:54

不要自动更改权限。这既没有帮助,也没有必要。

首先,解决当前的权限问题。您可以从使用另一个名称开始,而不是使用'Python',它与应用程序完全无关,很可能与python二进制文件混淆。'amount.storage'怎么样?如果有必要(而且只有在必要时(在默认情况下不是这样),请使用lschmod (在命令行中,而不是在程序中)来排序权限。如果你需要帮助的话,问问我们的姐妹网站超级用户。您可以使用touch amount.storage来尝试创建文件,使用rm amount.storage (都在命令行中,而不是在Python中)删除它。

之后,确保正确打开文件。因为您做了多次,所以有函数是值得的,这样您就不需要复制和粘贴代码了。让我们从加载函数开始:

代码语言:javascript
复制
import pickle

FILENAME = "amount.storage"

def load():
    with open(FILENAME, "rb") as f:
        return pickle.load(f)

通过使用语句,我们确保即使发生错误也关闭文件。说到错误,我们应该最明确地处理不存在的文件。让我们添加一个异常处理程序

代码语言:javascript
复制
def load():
    try:
        with open(FILENAME, "rb") as f:
            return pickle.load(f)
    except FileNotFoundError:
        return 0  # start with 0 if no storage present

然后,保存就很简单了;使用模式wb打开

代码语言:javascript
复制
def save(amount):
    with open(FILENAME, "wb") as f:
        pickle.dump(amount, f)

现在我们有了这些帮助函数,让我们在整个程序中使用它们:

代码语言:javascript
复制
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)

请注意,通过删除您复制和粘贴的所有代码,这个新程序更易于遵循,更易于更改。

除了更多的操作之外,接下来的步骤之一也可以是避免泡菜,它允许任何可以写入文件的人注入任意Python代码,从而打开了一个潜在的安全漏洞。相反,json呢?您所需要做的就是用pickle替换上面的三个实例,并删除存储文件一次/命名为amount.json,因为它的当前状态将不是有效的JSON文件。一个好处是JSON是人类可读的;编码一个数字只会导致数字作为一个人类可读的字符串(没有更多的)被写到文件中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37047966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档