import os
target_dir = "xxx.xxx.xx.xx/path/to/file/dir"
start_seq = "*** Start Sequence ***"
end_seq = "*** End Sequence ***"
def tp_parser(file):
with open(file) as in_f:
lines = in_f.readlines()
f_name = in_f.name[12:16]
for i, line in enumerate(lines):
if line.startswith(start_seq):
start_line = i
elif line.startswith(end_seq):
end_line = i
with open("{0}_Target_Map.txt".format(f_name), "w") as out_f:
for i, line in enumerate(lines):
if start_line <= i < end_line:
print(line)
# out_f.write(line)
for file in os.listdir(os.chdir(target_dir)):
tp_parser(file)
我编写了这个脚本来查看文件目录,提取每个文件的特定部分并将其写入单独的文本文件。如果有人能够对这里发生的事情有所了解,那就很好奇......
对于这部分:
if start_line <= i < end_line:
print(line)
# out_f.write(line)
如果我用print(line)运行脚本,我会回到“UnboundLocalError:在赋值之前引用的局部变量'end_line'”错误。但是,使用out_f.write(行)运行脚本可以按预期工作。
第二个稍微不那么恼人的问题是这部分:
for file in os.listdir(os.chdir(target_dir)):
tp_parser(file)
我无法向自己解释为什么我必须切换到工作目录(即os.chdir(target_dir))来实际迭代文件。我知道os.listdir()本身会返回一个文件名列表,但是如果你在os.listdir()中传递一个os.chdir()参数,它会有什么不同。
提前致谢。
答案 0 :(得分:2)
从最后开始,您不必切换到工作目录进行迭代。我想你想列出目标目录吗?
因此,您可以使用chdir
将目录更改为当前,或者将目录指定为listdir
。您正在使用第一个,但chdir
更改dir作为横向效果而不是结果。 chdir
正在返回None。因此,您使用listdir
拨打None
,仅凭运气接受None
作为使用当前目录的提示。
你可以写
os.chdir(target_dir)
for file in os.listdir():
tp_parser(file)
或
for file in os.listdir(target_dir):
tp_parser(file)
关于第一个问题,请注意您为条件语句指定了start_line
和end_line
。我怀疑你的问题是有时候其中一个条件没有达到,并且稍后在代码中使用未分配的名称会引发错误。
编辑:
此代码还有另一个问题,您正在将输出文件写入您列出的同一目录中。下次运行代码时,代码也将解析您的上一个输出文件。我想这不是预期的行为;但如果你继续,你会看到你的输出文件没有结束标记,因为你的输出条件不包括它:
if start_line <= i < end_line: # use of < instead of <= end_line excludes end marker from output
因此,在这种情况下的错误只是出现在其他人之间的错误的新输入文件。这是错误的巧合(用户错误),而不是Python代码意外行为。