赋值后变量出错?

时间:2016-01-18 22:19:40

标签: python function python-3.x namespaces

我在使用某个功能时遇到了一些问题。它是由Id标识的书写笔记程序的一部分。注释保存在txt文件中,结构为:

Open
Id
Title
Message
Close

此函数用于查找Id,在文件中获取其行号,然后通过将其复制到临时文件中将其删除。我遇到了失败:linea_buscada变量我们在此行中分配之前使用过:

linea == linea_buscada-1

我错过了什么?是"与"创建一个新命名空间?如果这是问题所在,实现目标的最佳方法是什么?我正在考虑一个全局变量或列表追加,但它们对于存储一个整数来说似乎太奇怪了。感谢您的帮助。

@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')    

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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')