意外打印()和os.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(行)运行脚本,则会获得" unboundlocalerror:local variable'end_line'在分配前引用的'end_line'错误"错误。但是,使用out_f.write(line)运行脚本按预期工作。

第二部分是:

for file in os.listdir(os.chdir(target_dir)):
    tp_parser(file)

我无法向自己解释为什么我必须切换到工作目录(即OS.CHDIR(target_dir))才能通过文件实际迭代。我知道os.listdir()本身会返回文件名列表,但是如果您通过os.chdir()参数在os.listdir()。

中有什么不同。

预先感谢。

从结束开始,您不必切换到工作dir到迭代。我想您想列出目标dir吗?因此,您要么使用chdir将DIR更改为电流,要么将DIR指定为listdir。您正在使用第一个,但是chdir将DIR更改为横向效果,而不是结果。chdir无返回。因此,您可以使用None调用listdir,这仅仅是运气就可以接受None作为使用当前DIR的提示。你可以写

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。我怀疑您的问题是,有时未满足其中一个条件,并且以后在代码中使用未分配的名称会提出错误。

编辑:

此代码还有另一个问题,您将输出文件写入与您列出的DIR中。下次您运行代码时,代码也将解析您的最后一个输出文件。我想这不是预期的行为;但是,如果继续进行,您会发现您的输出文件没有终点标记,因为您的输出条件不包括:

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

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

最新更新