2016-05-05 17 views
0

私はPythonの初心者です。金額や数字などを記録したプログラムを作成しようとしています。あなたは金額を加算または減算することができ、それはファイルに保存されるか、または現在の金額を確認します。私はそれがこのコードPython Pickleファイルのパーミッション

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' 

は、私はその後os.chmod機能を使用してみましたが、私はそれを正しく使用し、100%わかりません。

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コマンドを使用してアクセス許可の問題を過ぎましたように見えたが、加算または減算、ロードしようとしたとき、私はこのエラーを得ました。

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関数を正しく使用していないのかどうかはわかりません。誰も私にこの問題を解決する方法と/またはなぜそれが機能しなくなったのか教えてもらえますか?

答えて

0

権限を自動的に変更しないでください。それは役に立たず、必要でもありません。

まず、現在の権限の問題を整理してください。 'Python'の代わりに別の名前を使用することで開始できます。これはアプリケーションとはまったく関係がなく、pythonバイナリと混同される可能性があります。どのように'amount.storage'については?必要に応じて(必要に応じてデフォルトではない場合のみ)、プログラム内ではなくコマンドラインでlschmodを使用して権限を分類します。助けが必要な場合は、ask at our sister site superusertouch amount.storageを使用してファイルを作成し、rm amount.storage(どちらもコマンドラインで、Pythonシェルのではなく)を使用して削除できます。

その後、ファイルを正しく開いてください。複数回実行しているので、コードをコピーして貼り付ける必要がないように、functionsが必要です。ロード機能で始まるのをしてみましょう:

import pickle 

FILENAME = "amount.storage" 

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

with statementを使用することにより、我々は、エラーが発生した場合でも、ファイルを閉じてください。エラーと言えば、存在しないファイルを最も確実に処理する必要があります。さんはexception handlerを追加してみましょう:

def load(): 
    try: 
     with open(FILENAME, "rb") as f: 
      return pickle.load(f) 
    except FileNotFoundError: 
     return 0 # start with 0 if no storage present 

の保存は、簡単です。すべてのコードを除去することにより、あなたは、この新しいプログラムをコピーして貼り付けること

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) 

注:のは、プログラム全体でそれらを使用してみましょう、我々はこれらのヘルパー関数を得たことを今

def save(amount): 
    with open(FILENAME, "wb") as f: 
     pickle.dump(amount, f) 

を:モードwbで開きますそれに従うのがはるかに簡単で、ずっと簡単に変更できます。

次の手順の1つは、ファイルに書き込むことができる任意のPythonコードを挿入できるようにすることで潜在的なセキュリティホールを開くことです。代わりに、jsonはどうですか?上記のpickleの3つのインスタンスをjsonに置き換え、ストレージファイルを一度削除するか、amount.jsonという名前を付けてください。現在の状態は有効なJSONファイルではありません。プラスは、JSONは人間が読むことができるということです。数値をコード化すると、その数値は人間が読める文字列(とそれ以上は何もない)としてファイルに書き込まれます。

関連する問題