繁体   English   中英

意外的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:分配前引用的本地变量'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.listdir()中传递os.chdir()参数,这会有什么不同。

提前致谢。

从头开始,您不必切换到工作目录即可进行迭代。 我想您要列出目标目录吗? 因此,您可以使用chdir将目录更改为current,或者将目录指定为listdir 您正在使用第一个,但chdir更改dir是一种横向影响,而不是其结果。 chdir返回无。 因此,您listdir使用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代码意外的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM