意外的print()和os.listdir()功能

时间:2017-12-05 14:26:31

标签: python file operating-system chdir listdir

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()参数,它会有什么不同。

提前致谢。

1 个答案:

答案 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_lineend_line。我怀疑你的问题是有时候其中一个条件没有达到,并且稍后在代码中使用未分配的名称会引发错误。

编辑:

此代码还有另一个问题,您正在将输出文件写入您列出的同一目录中。下次运行代码时,代码也将解析您的上一个输出文件。我想这不是预期的行为;但如果你继续,你会看到你的输出文件没有结束标记,因为你的输出条件不包括它:

if start_line <= i < end_line: # use of < instead of <= end_line excludes end marker from output

因此,在这种情况下的错误只是出现在其他人之间的错误的新输入文件。这是错误的巧合(用户错误),而不是Python代码意外行为。