2016-02-12 40 views
0

我試圖導入一個文本文件並通過兩個關鍵字進行加密/解密。我設置了一個關鍵變量,但找不到找到它的正確位置。UnboundLocalError:在賦值之前引用的局部變量'key'

這是目前它是:

def importFile(): 
    importText = [] 
    file = input('What is the text file name: ') 
    fileName = open(file,'r') 
    text = fileName.read() 
    fileName.close() 
    fileName = text 
    message = text 
    #print (text) 
    delete = open(file,'w') 
    delete.write('') 
    key = input ('What key do you wnat to use: ') 

這裏就是key被稱爲:

def translatedMessage(mode): 
    translated = [] 
    keyIndex = 0 
    key = key.upper() 

    for symbol in message: 
     num =LETTERS .find(symbol.upper()) 
     if num != -1: 
      if mode == 'encrypt': 
       num += LETTERS .find(key[keyIndex]) 
      elif mode == 'decrypt': 
       num -= LETTERS .find(key[keyIndex]) 

      num %= len(LETTERS) 

      if symbol.isupper(): 
       translated.append(LETTERS[num]) 
      elif symbol.islower(): 
       translated.append(LETTERS[num].lower()) 

      keyIndex += 1 
      if keyIndex == len(key): 
       keyIndex = 0 
     else: 
      translated.append(symbol) 
    return ''.join(translated) 
if __name__ == '__main__': 
    main() 

如果你需要在這裏是一起:

LETTERS = 'ZABCDEFGHIJKLMNOPQRSTUVWXY' 
def main(): 
    myMode = input("Encrypt 'e' or Decrypt 'd': ") 
    if myMode == 'encrypt' or myMode == 'e': 
     translated = encryptFile() 
    elif myMode == 'decrypt' or myMode == 'd': 
     translated = decryptFile() 

def importFile(): 
    importText = [] 
    file = input('What is the text file name: ') 
    fileName = open(file,'r') 
    text = fileName.read() 
    fileName.close() 
    fileName = text 
    message = text 
    #print (text) 
    delete = open(file,'w') 
    delete.write('') 
    key = input ('What key do you wnat to use: ') 

def encryptFile(): 
    textFile = input("Would you like to import a text file 'Y' or 'N': ") 
    if textFile.lower() == 'y' : 
     importFile() 

    return translatedMessage('encrypt') 

def decryptFile(): 
    textFile = input("Would you like to import a text file 'Y' or 'N': ") 
    if textFile.lower() == 'y' : 
     importFile() 

    return translatedMessage('decrypt') 

def translatedMessage(mode): 
    translated = [] 
    keyIndex = 0 
    key = key.upper() 

    for symbol in message: 
     num =LETTERS .find(symbol.upper()) 
     if num != -1: 
      if mode == 'encrypt': 
       num += LETTERS .find(key[keyIndex]) 
      elif mode == 'decrypt': 
       num -= LETTERS .find(key[keyIndex]) 

      num %= len(LETTERS) 

      if symbol.isupper(): 
       translated.append(LETTERS[num]) 
      elif symbol.islower(): 
       translated.append(LETTERS[num].lower()) 

      keyIndex += 1 
      if keyIndex == len(key): 
       keyIndex = 0 
     else: 
      translated.append(symbol) 
    return ''.join(translated) 
if __name__ == '__main__': 
    main() 

我很新的編碼,並知道這很簡單,所以任何意見非常感謝:)

回答

2

在你的代碼的問題是,你是治療key像一個全局變量,但它是一個地方的,所以你需要在你的函數之間傳遞:

LETTERS = 'ZABCDEFGHIJKLMNOPQRSTUVWXY' 
def main(): 
    myMode = input("Encrypt 'e' or Decrypt 'd': ") 
    if myMode == 'encrypt' or myMode == 'e': 
     translated = encryptFile() 
    elif myMode == 'decrypt' or myMode == 'd': 
     translated = decryptFile() 

def importFile(): 
    importText = [] 
    file = input('What is the text file name: ') 
    fileName = open(file,'r') 
    text = fileName.read() 
    fileName.close() 
    fileName = text 
    message = text 
    #print (text) 
    delete = open(file,'w') 
    delete.write('') 
    return input ('What key do you wnat to use: ') # Return the key 

def encryptFile(): 
    textFile = input("Would you like to import a text file 'Y' or 'N': ") 
    if textFile.lower() == 'y' : 
     key = importFile() # Get the key returned by the function 

    return translatedMessage('encrypt', key) # Pass the key to the function 

def decryptFile(): 
    textFile = input("Would you like to import a text file 'Y' or 'N': ") 
    if textFile.lower() == 'y' : 
     key = importFile() # Get the key returned by the function 

    return translatedMessage('decrypt', key) # Pass the key to the function 

def translatedMessage(mode, key): # `key` is an argument 
    translated = [] 
    keyIndex = 0 
    key = key.upper() 

    for symbol in message: 
     num =LETTERS .find(symbol.upper()) 
     if num != -1: 
      if mode == 'encrypt': 
       num += LETTERS .find(key[keyIndex]) 
      elif mode == 'decrypt': 
       num -= LETTERS .find(key[keyIndex]) 

      num %= len(LETTERS) 

      if symbol.isupper(): 
       translated.append(LETTERS[num]) 
      elif symbol.islower(): 
       translated.append(LETTERS[num].lower()) 

      keyIndex += 1 
      if keyIndex == len(key): 
       keyIndex = 0 
     else: 
      translated.append(symbol) 
    return ''.join(translated) 
if __name__ == '__main__': 
    main() 

一個更簡單的解決辦法是將通過將global key行添加到importFile()函數中,將key定義爲全局變量。但是,一般來說,我認爲在Python中使用global關鍵字是不鼓勵的。

對Python中全局和局部變量的這種解釋可能會有幫助:http://www.python-course.eu/global_vs_local_variables.php

相關問題