需要一个脚本来遍历文件并执行命令
Need a script to iterate over files and execute a command
请耐心等待,我以前没有使用过 python,我正在尝试尽快完成一些渲染,并因此停止在我的轨道上。
我正在将 .ifd 文件输出到网络驱动器 (Z:),它们存储在如下文件夹结构中;
Z:
- [=10=]01
- [=10=]02
- [=10=]03
我需要遍历单个文件夹中的 ifd 文件,但文件的数量不是静态的,因此还需要有一个可定义的范围(1-300、1-2500 等)。因此,该脚本必须能够为开始和结束范围采用额外的两个参数。
在每次迭代中,它使用此语句执行名为 'mantra' 的操作;
mantra -f file.FRAMENUMBER.ifd outputFile.FRAMENUMBER.png
我在 Internet 上找到了一个应该执行类似操作的脚本;
import sys, os
#import command line args
args = sys.argv
# get args as string
szEndRange = args.pop()
szStartRange = args.pop()
#convert args to int
nStartRange = int(szStartRange, 10);
nEndRange = int(szEndRange, 10);
nOrd = len(szStartRange);
#generate ID range
arVals = range(nStartRange, nEndRange+1);
for nID in arVals:
szFormat = 'mantra -V a -f testDebris.%%(id)0%(nOrd)dd.ifd' % {"nOrd": nOrd};
line = szFormat % {"id": nID};
os.system(line);
我遇到的问题是我无法让它工作。它似乎在迭代,并做了一些事情 - 但它看起来只是将 ifds 吐到某个地方的不同文件夹中。
TLDR;
我需要一个至少有两个参数的脚本;
- startFrame
- endFrame
并从中创建一个 frameRange,然后使用它迭代所有执行以下命令的 ifd 文件;
- 真言-f fileName.currentframe.ifdfileName.currentFrame.png
如果我能够指定文件名、文件目录和输出目录,那就太好了。我已经尝试手动执行此操作,但必须有一些我不知道的约定,因为当我尝试时出现错误(在冒号处停止)。
如果有人可以联系我或为我指明正确的方向,那就太棒了。我知道我应该尝试学习 python,但我在渲染方面束手无策,需要帮助。
无需专门输入开始和结束范围,您可以这样做:
import os
path, dirs, files = os.walk("/Your/Path/Here").next()
nEndRange = len(files)
#generate ID range
arVals = range(1, nEndRange+1);
命令 os.walk()
计算您指定的文件夹中的文件数。
不过,获得所需输出的更简单方法如下:
import os
for filename in os.listdir('dirname'):
szFormat = 'mantra -f ' + filename + ' outputFile.FRAMENUMBER.png'
line = szFormat % {"id": filename}; # you might need to play around with this formatting
os.system(line);
因为os.listdir()
遍历指定目录,filename
是那个目录下的每一个文件,所以你甚至不需要计算它们。
对构建命令有一点帮助。
for nID in arVals:
command = 'mantra -V a -f '
infile = '{0}.{1:04d}.ifd '.format(filename, id)
outfile = '{0}.{1:04d}.png '.format(filename, id)
os.system(command + infile + outfile);
并且绝对使用 os.walk
或 os.listdir
就像@logic 推荐的
for file in os.listdir("Z:"):
filebase = os.path.splitext(file)[0]
command = 'mantra -V a -f {0}.ifd {0}.png'.format(filebase)
import os, subprocess, sys
if len(sys.argv) != 3:
print('Must have 2 arguments!')
print('Correct usage is "python answer.py input_dir output_dir" ')
exit()
input_dir = sys.argv[1]
output_dir = sys.argv[2]
input_file_extension = '.txt'
cmd = 'currentframe'
# iterate over the contents of the directory
for f in os.listdir(input_dir):
# index of last period in string
fi = f.rfind('.')
# separate filename from extension
file_name = f[:fi]
file_ext = f[fi:]
# create args
input_str = '%s.%s.ifd' % (os.path.join(input_dir, file_name), cmd)
output_str = '%s.%s.png' % (os.path.join(output_dir + file_name), cmd)
cli_args = ['mantra', '-f', input_str, output_str]
#call function
if subprocess.call(cli_args, shell=True):
print('An error has occurred with command "%s"' % ' '.join(cli_args))
这应该足以让您当前使用或稍作修改。
请耐心等待,我以前没有使用过 python,我正在尝试尽快完成一些渲染,并因此停止在我的轨道上。
我正在将 .ifd 文件输出到网络驱动器 (Z:),它们存储在如下文件夹结构中;
Z:
- [=10=]01
- [=10=]02
- [=10=]03
我需要遍历单个文件夹中的 ifd 文件,但文件的数量不是静态的,因此还需要有一个可定义的范围(1-300、1-2500 等)。因此,该脚本必须能够为开始和结束范围采用额外的两个参数。
在每次迭代中,它使用此语句执行名为 'mantra' 的操作;
mantra -f file.FRAMENUMBER.ifd outputFile.FRAMENUMBER.png
我在 Internet 上找到了一个应该执行类似操作的脚本;
import sys, os
#import command line args
args = sys.argv
# get args as string
szEndRange = args.pop()
szStartRange = args.pop()
#convert args to int
nStartRange = int(szStartRange, 10);
nEndRange = int(szEndRange, 10);
nOrd = len(szStartRange);
#generate ID range
arVals = range(nStartRange, nEndRange+1);
for nID in arVals:
szFormat = 'mantra -V a -f testDebris.%%(id)0%(nOrd)dd.ifd' % {"nOrd": nOrd};
line = szFormat % {"id": nID};
os.system(line);
我遇到的问题是我无法让它工作。它似乎在迭代,并做了一些事情 - 但它看起来只是将 ifds 吐到某个地方的不同文件夹中。
TLDR;
我需要一个至少有两个参数的脚本;
- startFrame
- endFrame
并从中创建一个 frameRange,然后使用它迭代所有执行以下命令的 ifd 文件;
- 真言-f fileName.currentframe.ifdfileName.currentFrame.png
如果我能够指定文件名、文件目录和输出目录,那就太好了。我已经尝试手动执行此操作,但必须有一些我不知道的约定,因为当我尝试时出现错误(在冒号处停止)。
如果有人可以联系我或为我指明正确的方向,那就太棒了。我知道我应该尝试学习 python,但我在渲染方面束手无策,需要帮助。
无需专门输入开始和结束范围,您可以这样做:
import os
path, dirs, files = os.walk("/Your/Path/Here").next()
nEndRange = len(files)
#generate ID range
arVals = range(1, nEndRange+1);
命令 os.walk()
计算您指定的文件夹中的文件数。
不过,获得所需输出的更简单方法如下:
import os
for filename in os.listdir('dirname'):
szFormat = 'mantra -f ' + filename + ' outputFile.FRAMENUMBER.png'
line = szFormat % {"id": filename}; # you might need to play around with this formatting
os.system(line);
因为os.listdir()
遍历指定目录,filename
是那个目录下的每一个文件,所以你甚至不需要计算它们。
对构建命令有一点帮助。
for nID in arVals:
command = 'mantra -V a -f '
infile = '{0}.{1:04d}.ifd '.format(filename, id)
outfile = '{0}.{1:04d}.png '.format(filename, id)
os.system(command + infile + outfile);
并且绝对使用 os.walk
或 os.listdir
就像@logic 推荐的
for file in os.listdir("Z:"):
filebase = os.path.splitext(file)[0]
command = 'mantra -V a -f {0}.ifd {0}.png'.format(filebase)
import os, subprocess, sys
if len(sys.argv) != 3:
print('Must have 2 arguments!')
print('Correct usage is "python answer.py input_dir output_dir" ')
exit()
input_dir = sys.argv[1]
output_dir = sys.argv[2]
input_file_extension = '.txt'
cmd = 'currentframe'
# iterate over the contents of the directory
for f in os.listdir(input_dir):
# index of last period in string
fi = f.rfind('.')
# separate filename from extension
file_name = f[:fi]
file_ext = f[fi:]
# create args
input_str = '%s.%s.ifd' % (os.path.join(input_dir, file_name), cmd)
output_str = '%s.%s.png' % (os.path.join(output_dir + file_name), cmd)
cli_args = ['mantra', '-f', input_str, output_str]
#call function
if subprocess.call(cli_args, shell=True):
print('An error has occurred with command "%s"' % ' '.join(cli_args))
这应该足以让您当前使用或稍作修改。