Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python3:在os.walk上遇到问题_Python_Python 3.x - Fatal编程技术网

python3:在os.walk上遇到问题

python3:在os.walk上遇到问题,python,python-3.x,Python,Python 3.x,我有以下目录/文件设置(简化): 在每个Y目录中,我需要创建一个“psub”文件,其中包含一个.dat文件列表,并将其附加到文件“top.txt”的副本中 我试图使用python 3中的os.walk函数来实现这一点:但是我遇到了两个问题: 1.新psub文件出现在X0.0目录中 2.代码没有列出任何文件名(可能是因为找不到任何文件名),然后给出错误,即找不到X0.05目录 到目前为止,我有以下代码: import os with open('top.txt', 'r') as reader:

我有以下目录/文件设置(简化):

在每个Y目录中,我需要创建一个“psub”文件,其中包含一个.dat文件列表,并将其附加到文件“top.txt”的副本中

我试图使用python 3中的os.walk函数来实现这一点:但是我遇到了两个问题:
1.新psub文件出现在X0.0目录中
2.代码没有列出任何文件名(可能是因为找不到任何文件名),然后给出错误,即找不到X0.05目录

到目前为止,我有以下代码:

import os

with open('top.txt', 'r') as reader:
    data=reader.read()
    for root, dirs, files in os.walk('.'):
        for folder in dirs:
            os.chdir(os.path.join(root, folder))
            with open('psub', 'a') as writer:
                writer.write(data)
                for names in files:
                    if names.endswith('.dat'):
                        print('gulp <' + names + '> ', end='', file=writer)
                        print(names.rsplit('.',1)[0], end='', file=writer)
                        print('.out', file=writer)
导入操作系统
使用open('top.txt','r')作为读卡器:
data=reader.read()
对于os.walk('.')中的根目录、目录和文件:
对于目录中的文件夹:
chdir(os.path.join(根目录,文件夹))
以open('psub','a')作为写入程序:
writer.write(数据)
对于文件中的名称:
如果名称为.endswith('.dat'):
打印('gulp',end='',file=writer)
打印(names.rsplit('.',1)[0],end='',file=writer)
打印('.out',file=writer)
生成的psub文件应为:

#!/bin/bash
#MOAB -l walltime=48:00:0
#MOAB -j oe
#MOAB -N GULP-job
cd "$PBS_O_WORKDIR"
module load apps/gulp
#!/bin/bash
gulp <X0.00Y0.00Z0.00.dat> X0.00Y0.00Z0.00.out
gulp <X0.00Y0.00Z0.05.dat> X0.00Y0.00Z0.05.out
#/bin/bash
#摩押-l walltime=48:00:0
#摩押-j oe
#摩押人的工作
cd“$PBS___WORKDIR”
模块加载应用程序/吞咽
#!/bin/bash
吞咽X0.00Y0.00Z0.00.00
吞咽X0.00Y0.00Z0.05.05
其中前七行在top.txt中

任何(简单的)关于我错在哪里的指点都将不胜感激。
Cheers

walk
意味着自己递归地遍历所有目录,因此 不需要自己遍历所有子目录。去掉dirs:循环中文件夹的

我还建议使用单个字符串格式命令替换多个打印语句,如下所示:

print('gulp <{}.dat> {}.out'.format(names.rsplit('.',1)[0]), file=writer)
#or use writer.write(), to make it more transparent
Python应该由许多小函数组成,而不是嵌套在二十层深处的大而长的怪物

此外,通过分解代码,您可以准确地确定代码的哪一部分导致了问题,因为您可以单独测试每个函数。如果您怀疑(例如)问题是无法正确识别
.dat
文件,您可以自行测试
isDat
功能,直到您修复它为止。如果您怀疑问题在于写入
psub
文件,可以通过使用虚拟实现替换
gulpline
来检查问题(在虚拟实现中,它使用预定的结果列表,或者让用户手动执行,而不是实际生成结果)


您可以做的另一件事是在循环中插入调试代码。例如,插入一条语句,在您(假定)向其写入
数据后输出
writer
的内容,以检查您是否实际拥有期望的内容。另一个调试选项是运行部分代码;例如,运行一个只执行walk循环的程序,或者只将
数据写入文件,或者只解析文件名(出于检查目的,将写入文件的内容打印到控制台)。

walk
意味着自己递归地遍历所有目录,因此 不需要自己遍历所有子目录。去掉dirs:
循环中文件夹的

我还建议使用单个字符串格式命令替换多个打印语句,如下所示:

print('gulp <{}.dat> {}.out'.format(names.rsplit('.',1)[0]), file=writer)
#or use writer.write(), to make it more transparent
Python应该由许多小函数组成,而不是嵌套在二十层深处的大而长的怪物

此外,通过分解代码,您可以准确地确定代码的哪一部分导致了问题,因为您可以单独测试每个函数。如果您怀疑(例如)问题是无法正确识别
.dat
文件,您可以自行测试
isDat
功能,直到您修复它为止。如果您怀疑问题在于写入
psub
文件,可以通过使用虚拟实现替换
gulpline
来检查问题(在虚拟实现中,它使用预定的结果列表,或者让用户手动执行,而不是实际生成结果)


您可以做的另一件事是在循环中插入调试代码。例如,插入一条语句,在您(假定)向其写入
数据后输出
writer
的内容,以检查您是否实际拥有期望的内容。另一个调试选项是运行部分代码;例如,运行一个只执行walk循环的程序,或者只将
数据写入文件,或者只解析文件名(出于检查目的,将写入文件的内容打印到控制台)。

您认为您的代码是做什么的?您对psub文件的功能/用途的解释有些混乱;它们是用来作为文件的目录列表,还是在您收集文件名时作为临时存储,还是它们已经是dat文件的目录?从解释来看,它们也可以是可执行文件,将某种目录列表附加到
psubtry.txt
@AJMansfield。psub文件将使我能够在hpc系统上运行计算化学代码(gulp),读取.dat文件作为输入。@AJMansfield我认为代码应该“遍历”目录:即在顶部目录“Ce”中查找和文件夹,然后在子目录中查找哪些文件/文件夹。我可以从我更改目录的那一行看出找不到X0.05目录的错误在哪里,但在其他方面我被难住了(可能会感到困惑……)<代码>操作系统.CHDIR 在<>代码>操作系统的迭代过程中.Wave肯定是一个bug。您不需要将代码> Chdir 写入一个目录中,在那里写入一个新文件——只需使用<代码> OS.PATH。
import os

def isDat(filename): return filename.endswith('.dat')

def hasDat(filenames): #this method checks if it contains one ending with '.dat'
    for filename in filenames:
        if isDat(filename): return true
    return false

def datFiles(filenames):
    for filename in filenames:
        if isDat(filename): yield filename

def gulpLines(filenames):
    for filename in datFiles(filenames):
        yield 'gulp <{}.dat> {}.out\n'.format(filename.rsplit('.',1)[0])

def makePsub(root, filenames, prologue):
    with os.open(os.path.join(root, 'psub'), 'a') as writer:
    #try putting 'psub.sh' instead, perhaps it is getting confused with no extension
        writer.write(prologue)
        for gulpLine in gulpLines(filenames):
            writer.write(gulpLine)


with open('top.txt') as reader:
    prologue=reader.read() #this is a much more descriptive name
#you can close it as soon as you have its contents

for root, dirs, filenames in os.walk('.'):
    if hasDat(filenames):
        makePsub(root, filenames, prologue)