2017-07-15 4 views
0

ここで間違っていることはわかりません。 main関数は正常に動作しますが、.txtファイル関数にデータを追加/書き込みすることはできません。私は "NameError:name 'data'が定義されていない"を取得し続けます。スコープの問題だと思いますか?他の機能からのデータを使用

質問:main関数を実行して出力をファイルに書き込むにはどうすればよいですか?メイン関数の出力にアクセスするにはどうすれば他の関数を実行できますか?

ご協力ありがとうございます!

import sys, os 

print("\n-------------------------- String HexDump ------------------------------------\n") 


def main(): 
    try: 
     with open(sys.argv[1], 'rb') as file: 
      for line in range(0, os.path.getsize(sys.argv[1]), 60): 
       data = file.read(60) 
       data = str(data) 
       print(data) 
    except: 
     print('Usage: {} <filename>'.format(os.path.basename(sys.argv[0]))) 


str = lambda data: ''.join(31 < i < 127 and chr(i) or '.' for i in data) 


if __name__ == '__main__': 
    main() 



def HexStrFileDump(): 
    with open('HEXDUMPFILE2.txt','wb') as HexFile: 
     HexFile.write(data) 

HexStrFileDump() 
+0

'data'はモジュールに対してグローバルでなければなりません。これで 'data'は' main'関数のローカル変数です。グローバル変数を関数にインポートするには、関数の先頭に 'global'キーワードを使います。 – Grimmy

+0

グローバル変数を 'global'でインポートすることなく読み込むことはできますが、グローバル変数に値を代入することはできません。 – Grimmy

+0

https://stackoverflow.com/questions/423379/using-global-variables-in-a-function-other-than-the-one-that-c​​reated-them – Grimmy

答えて

0

あなたは間違った順序でと(data)と範囲の外に存在していない変数を持つすべての機能を呼び出しています。

main()を使用する場合は、ここにすべてのコードを集中させ、サブファンクションではベストプラクティスを広げないことです。

エラーは、HexFile.write(data)の不適切な使用に起因します。データはあなたの結果ではなくラムダの名前です。ここで

は、私はこの答えのために5分で書いた適切なファイルhexdumperです:

import sys 

def main(): 
    print("\n-------------------------- String HexDump ------------------------------------\n") 
    try: 
     with open(sys.argv[1], 'rb') as file: 
      i = 0; clear = "" 
      for char in file.read(): 
       if char > 0x19 and char < 0x7f: 
        clear = clear + chr(char) 
       else: 
        clear = clear + "?" 
       if i % 4 == 0 and i != 0: 
        clear = clear + " " 
        sys.stdout.write(" ") 
       if i % 16 == 0 and i != 0: 
        sys.stdout.write(clear+"\n") 
        clear = "" 
        i = 0 
       sys.stdout.write("%02X" % char) 
       i += 1 
      if i % 16 != 0: 
       sys.stdout.write(" "+clear+"\n") 
    except: 
     raise 
     print('Usage: {} <filename>'.format(os.path.basename(sys.argv[0]))) 


if __name__ == '__main__': 
    main() 
+0

IMOこれは、質問者が彼らが得ているエラーをなぜ見ているのかを説明することはあまりありません。 –

+0

あなたのご意見をお寄せいただきありがとうございます。コード内のデータの不適切な使用について、より具体的にお答えしました。 – Fabien

0

エラーがどこから来ている私たちが見ることができるようにあなたが本当にスタックトレースを掲載しているはずですが、運がよけれこのプログラムには、あなたが記述しているエラーを引き起こす可能性のある場所が1つしかありません。

def HexStrFileDump(): 
    with open('HEXDUMPFILE2.txt','wb') as HexFile: 
     HexFile.write(data) 
        ^

この時点では、変数dataは定義されていません。それは、関数の前の方、またはモジュールレベルのどちらかに値を割り当てなければなりませんが、あなたはそれをしていません。

あなたは main()data変数を持っていますが、その変数は main()の内側に存在し、また、あなたが strを呼び出すラムダ関数内の異なる data変数を持っていますが、もう一度、その変数は、その関数内に存在します。 HexStrFileDump()のコードに関しては、他の変数 dataは存在しないため、 dataが定義されていないという不満があります。

+0

さて、ここに私がいる場所があります。私は主な機能に「グローバルデータ」と「データを返す」を追加しました。今私はそれを実行すると、それはファイルに書き込みますが、それはデータの最初の行を書き込みます。私はファイルにすべてを書き込むことができませんでした。私には、グローバル変数のデータにアクセスできるようになったようですが、それでも間違っていますか?私はまだ学んでいる私を許してください。 @David Z – Dpsmurphy

関連する問題