2
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() 本身会返回一个文件名列表,但是如果您在 os.listdir() 中传递 os.chdir() 参数,那有什么不同。

提前致谢。

4

1 回答 1

2

从最后开始,您不必切换到工作目录进行迭代。我想你想列出目标目录对吗?因此,您要么将 dir 更改为 current with,要么将 dirchdir指定为listdir. 您正在使用第一个,但chdir更改 dir 作为横向效果而不是结果。chdir正在返回无。因此,您调用listdirwith 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 代码的意外行为。

于 2017-12-05T14:59:33.040 回答