[英]python assigning variable mess
我正在尝试编写一个脚本,该脚本包括:1.列出目录的内容,创建目录的列表(temp.txt),将该列表转换为字符串并将其写入文件2.打开另一个文本文件(t (.txt),并将打开的文件的内容与先前保存的文件(temp.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
和脚本:
import os
li = []
lu = []
le = []
def dir():
dir = raw_input("Enter directory > ")
path=dir # insert the path to the directory of interest
dirList=os.listdir(path)
for fname in dirList:
li.append(fname)
li = ','.join(str(n) for n in li)
targetfile = open("temp.txt", 'w')
targetfile.write(li)
targetfile.close()
print li
def open_file():
txt = open('t.txt')
li = txt.read()
la = li.split()
return la
print len(li)
def open_another():
txt = open('temp.txt')
lu = txt.read()
lo = lu.split()
return lo
print len(li)
dir()
a = open_file()
b = open_another()
print set(a) & set(b)
在函数内部使用global li
。 据我了解,Python解释器仅在无法在本地找到全局变量的情况下才会在全局范围内寻找全局变量。 将它们设置在local方法中的某个位置(即使在可能的“读取”之后)就足够了,以便解释器将它们绑定到本地范围,从而忽略任何全局声明并导致您看到的错误。
例如:
a = 3
def b():
print a
a = 1
即使在执行print
语句时全局定义a
也会失败。 在函数体的开头添加global a
会使它起作用。
这里有很多概念上的问题。 为了实际教学,我已经彻底检查了代码:
无条件return
后无法print
。 我想您已经将它们用于调试,但是没有必要保留它们。 (我假设也确实不需要从dir
print li
。)
您的函数名称应能更好地表明函数的实际作用。 open_file
是一个无用的名称,因为该函数实际上会对文件的内容执行某些操作。
类似地,变量名称应指出变量内容的含义。 如果您不能拿出好名字,则表明该变量是不必要的。 另一个迹象是,您将值存储一次,然后使用一次。 此处涉及变量的唯一原因是分解一个表达式并给它起一个名字,但是这里您有简单的表达式而没有好名字。 因此,只写一个表达式。
您可能想将目录列表写为行列表,因此请使用换行符(而不是逗号)将它们连接起来。
与读取整个文件并拆分结果字符串相比,还有什至更简单的方法来获取文件中的行列表。 它们通常也会更高效。 实际上,您不需要构造列表,然后从列表中构造一个集合。 您可以直接创建集合。
open_file
和open_another
执行相同的任务,因此是多余的。 只需传入一个文件名并使用它即可。
尝试将功能职责划分为逻辑块。 特别是,请勿在进行计算的地方处理I / O。
在现代Python中,我们使用with
块来处理完文件后自动关闭文件。
os.listdir
已经创建了一个列表,因此没有理由进行循环以将列表项附加到另一个列表。 例如,您可以使用+
一次附加整个内容; 但您的明显意图是将其追加到一个空列表,因此您可以直接分配。 实际上,不需要全局变量或赋值,因此我们将直接使用os.listdir
结果。
您的程序可以很简单:
import os
def make_dirfile(directory):
with open('temp.txt', 'w') as dirfile:
dirfile.write('\n'.join(os.listdir(directory)))
def unique_lines_of(filename):
with open(filename) as input_file:
return set(input_file)
make_dirfile(raw_input("Enter directory > "))
print unique_lines_of('temp.txt') & unique_lines_of('t.txt')
(并且假定创建目录文件实际上是必需的...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.