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

Unexpected print() and os.listdir() functionality

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: local variable 'end_line' referenced before assignment" 错误。但是,运行使用 out_f.write(line) 将脚本按预期工作。

第二个稍微不那么烦人的问题是这部分:

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

我无法向自己解释为什么我必须切换到工作目录(即 os.chdir(target_dir))才能实际遍历文件。我知道 os.listdir() 本身 returns 一个文件名列表,但是如果你在 os.listdir() 中传递 os.chdir() 参数,那有什么不同.

提前致谢。

从头到尾,您不必切换到工作目录进行迭代。我想你想列出目标目录吧? 因此,您可以使用 chdir 将目录更改为当前目录,或者将目录指定为 listdir。您正在使用第一个,但 chdir 将 dir 更改为横向效果而不是结果。 chdir 返回 None。因此,您使用 None 调用 listdir,幸运的是它接受 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 代码意外行为。