【问题标题】:Unexpected print() and os.listdir() functionality意外的 print() 和 os.listdir() 功能
【发布时间】:2018-05-19 06:01:32
【问题描述】:
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() 参数,那有什么不同。

提前致谢。

【问题讨论】:

    标签: python file operating-system chdir listdir


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答,非常感谢!但是有两个后续问题: 1. Running: for file in os.listdir(target_dir): tp_parser(file) 给我一个文件未找到错误。我认为这是因为试图将文件名字符串插入到 open(file) 中,这促使我使用 os.chdir()(在顶部或在 listdir() 中)作为解决方法。 2.我认为您对不满足条件的看法是正确的,但我很好奇为什么在使用 out_f.write(line) 时不会抛出相同的错误?
    • 这只是我怀疑的巧合;),请参阅我的答案编辑。
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2016-10-08
    • 2012-10-04
    相关资源
    最近更新 更多