我想写一个剧本。列出目录的内容,创建目录的列表(温度文本),将列表转换为字符串并将其写入文件2。打开另一个文本文件(t.txt),并将打开的文件的内容与以前保存的文件进行比较(温度文本)并返回差额。这样做的目的是脚本能够判断文件夹中是否有新文件。函数dif作为一个独立的脚本工作得很好,但是当作为函数嵌套时,我得到以下错误消息:
Enter directory > /users
Traceback (most recent call last):
File "/Users/alkopop79/NetBeansProjects/comparefiles.py", line 33, in <module>
dir()
File "/Users/alkopop79/NetBeansProjects/comparefiles.py", line 12, in dir
li.append(fname)
UnboundLocalError: local variable 'li' referenced before assignment
还有剧本:
^{pr2}$
这里有很多概念上的问题。为了实际教学,我已经彻底地复习了代码:
在一个无条件的
return
之后的print
无法访问;我想您已经将这些用于调试,但是将它们保留在周围没有任何意义。(我假设print li
来自dir
的print li
也不需要。)函数名应该能更好地指示函数的实际功能。
open_file
是一个无用的名称,因为函数实际上对文件的内容做了一些事情。同样,变量名也应该表示变量内容的含义。如果你找不到一个好名字,那说明这个变量是不必要的。另一个标志是存储一次值,然后使用一次;这里涉及变量的唯一原因是分解一个表达式并给某个对象起一个名称,但是这里的表达式很简单,没有好的名称。所以只要写出一个表达式。
你大概想把目录列表写成一个行列表,所以用新行连接它们,而不是逗号。
有比读取整个文件并拆分结果字符串更简单的方法来获取文件中的行列表。他们通常也会更有效率。实际上,您不需要构造列表,然后从列表构建集合;您可以直接创建集合。
open_file
和{尝试将功能的职责划分为逻辑块。特别是,不要在进行计算的同一位置处理I/O。
在现代Python中,我们使用
with
块来处理完成后自动关闭文件。os.listdir
已经创建了一个列表,因此没有理由进行循环以将列表项附加到另一个列表中。例如,您可以使用+
一次附加整个内容;但是您的明显意图是附加到一个空列表中,所以您可以直接赋值。实际上,不需要全局变量或赋值,所以我们直接使用os.listdir
结果。你的程序可以这么简单:
(这假设创建目录文件实际上是一项要求…)
在函数中使用
global li
。据我所知,Python解释器只有在本地找不到全局范围内的全局变量时,才会在全局范围内查找全局变量。在本地方法中的某个地方设置它们就足够了(即使是在可能的“read”之后),解释器将它们绑定到局部作用域,从而忽略任何全局声明并导致您看到的错误。在例如:
将失败,即使
a
是在执行print
语句时全局定义的。在函数体的开头添加global a
可以使其工作。在相关问题 更多 >
编程相关推荐