2016-01-18 26 views
0

我遇到一些功能問題。它是編寫筆記的程序的一部分,由Id標識。票據都保存在一個txt文件,結構爲:分配後的變量出錯?

Open 
Id 
Title 
Message 
Close 

此功能是爲了找到一個Id,獲取文件中的行號,後來通過複製到一個臨時文件刪除。我有一個失敗:

linea == linea_buscada-1 

的我缺少什麼:在linea_buscada變量我們正在這條線之前分配使用? 「with」是否會創建一個新的名稱空間?如果這是問題,那麼實現我的目標的最佳方式是什麼?我正在考慮一個全局變量或列表追加,但它們都存儲一個整數似乎太奇怪了。感謝您提前的幫助。

@staticmethod 
def eliminar_nota(ID = None): 
    ID = str(ID) or input('ID?: ') 
    linea = 1 
    try: 
     with open('temp.txt', 'x+') as archivo_temporal: 
      with open("notas.txt", "r") as archivo_notas: 
       for line in archivo_notas: 
        linea += 1 
        archivo_temporal.write(line) 
        if ID in line: 
         linea_buscada = linea 
      os.remove("notas.txt") 
      archivo_temporal.seek(0,0) 
      with open("notas.txt", "w") as archivo_notas: 
       linea = 1 
       counting = False 
       for line in archivo_temporal: 
        linea += 1 
        if linea == linea_buscada - 1: 
         counting = 5 
        if not counting: 
         archivo_notas.write(line) 
        else: 
         counting -= 1 
         continue 
    finally: 
     os.remove('temp.txt')  

回答

0

它看起來像linea_buscada不能得到初始化中:

if ID in line: 
    linea_buscada = linea 

否則它會被點賦值的失敗。我會添加一些打印語句來檢查它是否正在設置。沒有你的輸入文件,我無法檢查自己。

如果下面的代碼失敗,問題是第一組嵌套語句設置linea_buscada。

e.g:

@staticmethod 
def eliminar_nota(ID = None): 
    ID = str(ID) or input('ID?: ') 
    linea = 1 
    try: 
     with open('temp.txt', 'x+') as archivo_temporal: 
      with open("notas.txt", "r") as archivo_notas: 
       for line in archivo_notas: 
        linea += 1 
        archivo_temporal.write(line) 
        if ID in line: 
         linea_buscada = linea 
         print(linea_buscada) 
      print('Si no veo nada antes aqui, hay problemas ;)') 
      os.remove("notas.txt") 
      archivo_temporal.seek(0,0) 
      with open("notas.txt", "w") as archivo_notas: 
       linea = 1 
       counting = False 
       for line in archivo_temporal: 
        linea += 1 
        if linea == linea_buscada - 1: 
         counting = 5 
        if not counting: 
         archivo_notas.write(line) 
        else: 
         counting -= 1 
         continue 
    finally: 
     os.remove('temp.txt') 
0

你沒有在任何地方定義linea_buscada。你需要以某種方式初始化:

linea_buscada = 100 # Where '100' should really be the number of lines you're dealing with. 

當此行的解釋:

if linea == linea_buscada - 1: 

什麼情況是,它會嘗試的linea_buscada價值「替補」。然後它會將該值減1,並測試它是否等於linea。但是,沒有爲linea_buscada設置任何值,所以這種解釋不會發生,並且您看到了失敗。

在你的程序早些時候,你有這樣的:

if ID in line: 
    linea_buscada = linea 

然而,如果測試失敗ID in line(即返回false),該linea_buscada能不能在此設置。您with open("notas.txt", "w")之前,您需要確保linea_buscada設置:

if linea_buscada is not null: 
    # Continue with the program