当前位置: 首页 > 知识库问答 >
问题:

意外的print()和操作系统。listdir()函数

子车睿
2023-03-14
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:localvariable'end_line'referenced before assignment”错误。但是,运行带有out_f.write(行)的脚本可以按预期工作。

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

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

我无法向自己解释为什么我必须切换到工作目录(即os.chdir(target_dir))来实际遍历文件。我知道操作系统。listdir()本身返回一个文件名列表,但是如果您传递一个操作系统,这有什么不同呢。操作系统中的chdir()参数。listdir()。

提前谢谢。

共有1个答案

邬博涉
2023-03-14

从末尾开始,您不必切换到工作目录进行迭代。我想你想把目标目录列出来,对吗?因此,您可以使用chdir将dir更改为current,或者将dir指定为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\u lineend\u line。我怀疑您的问题是,有时其中一个条件不满足,在代码后面使用未分配的名称会导致错误。

编辑:

这段代码还有另一个问题,您正在将输出文件写入列出的同一个目录。下次运行代码时,代码还将解析最后一个输出文件。我想这不是预期的行为;但是如果你继续,你会看到你的输出文件没有结束标记,因为你的输出条件排除了它:

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

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

 类似资料:
  • 操作系统提供的服务 操作系统的五大功能,分别为:作业管理、文件管理、存储管理、输入输出设备管理、进程及处理机管理 中断 所谓的中断就是在计算机执行程序的过程中,由于出现了某些特殊事情,使得CPU暂停对程序的执行,转而去执行处理这一事件的程序。等这些特殊事情处理完之后再回去执行之前的程序。中断一般分为三类: 内部异常中断:由计算机硬件异常或故障引起的中断; 软中断:由程序中执行了引起中断的指令而造成

  • sed sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。 sed命令行格式为: sed [-nefri] ‘command’ 输入文本 常用选项: -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的

  • 进程与线程 对于有线程系统: 进程是资源分配的独立单位 线程是资源调度的独立单位 对于无线程系统: 进程是资源调度、分配的独立单位 进程之间的通信方式以及优缺点 管道(PIPE) 有名管道:一种半双工的通信方式,它允许无亲缘关系进程间的通信 优点:可以实现任意关系的进程间的通信 缺点: 长期存于系统中,使用不当容易出错 缓冲区有限 无名管道:一种半双工的通信方式,只能在具有亲缘关系的进程间使用(父

  • 1 select,poll和epoll 其实所有的I/O都是轮询的方法,只不过实现的层面不同罢了. 这个问题可能有点深入了,但相信能回答出这个问题是对I/O多路复用有很好的了解了.其中tornado使用的就是epoll的. selec,poll和epoll区别总结 基本上select有3个缺点: 连接数受限 查找配对速度慢 数据由内核拷贝到用户态 poll改善了第一个缺点 epoll改了三个缺点.

  • 你可以在任何主流操作系统下去做开发工作,Windows,macOS,Linux 都可以。如果选择 Windows ,版本最好选择 Windows 10 专业版。用 macOS 的用户不用太担心系统问题,可以无痛并免费升级,现在你应该用的是 Sierra 这个版本的 macOS 。Linux 也可以,比如 Ubuntu 的桌面版。 如果你能满足下面三个条件的其中一个,这个任务就算完成了: Windo

  • 指令运行参数 设定变量T为指令运行总时间,t为所需时间最长部分指令的时间(周期),n为指令条数 指令相关公式 顺序方式运行指令所需时间:Tn 流水方式运行指令所需时间:T+(n-1)t 重叠方式运行指令所需时间:(n+2)t 吞吐率:n/流水方式运行指令所需时间 效率:效率=吞吐率t 加速比:加速比=效率n 可变分区分配算法 首次适应法 从主存低地址开始,寻找第一个可用(即大于等于作业需求的内存)