所以我有一个python脚本,它将文件名作为命令参数并处理该文件。但是,因为我有263个文件需要相同的处理,我想知道是否可以使用for循环修改命令参数部分以连续运行文件夹中的所有文件?干杯,周六
编辑:
系统参数的代码在这里:
try:
opt_list, args = getopt.getopt(sys.argv[1:], 'r:vo:A:Cp:U:eM:')
except getopt.GetoptError, msg:
print 'prepare_receptor4.py: %s' %msg
usage()
sys.exit(2)
'r'是需要处理的文件的名称,其他是可选参数。我不知道如何用for循环来修改它。
答案 0 :(得分:10)
实际上,无论你使用什么shell,都可能有一些语法可以很容易地用于此。在Bash中,例如:
for f in *; do python myscript.py $f; done
要在Python中实际执行此操作,我建议您构建程序,以便主代码位于一个带有一个参数(文件名)的函数中。
def process(filename):
...code goes here...
然后你可以像这样调用这个函数,
for f in os.listdir(folder):
process(f)
folder
可以作为命令行参数传递,或者只是写入脚本(如果它不是你要重用的东西)。
编辑:为了回应您的编辑,我建议只使用常规命令行参数提供文件名,而不使用-r
选项,这样他们就会结束在args
。然后就可以了
for f in args:
process(f)
或者如果您希望将目录名称作为命令行参数传递,
for d in args:
for f in os.listdir(d):
process(f)
或者,我想您可以传递-r
选项的多个实例,然后执行
for opt, arg in opt_list:
if opt == '-r':
process(arg)
答案 1 :(得分:5)
当我处理多个文件/文件夹时,我通常使用os.walk:
import os
for root, dirs, files in os.walk(dir):
for fname in files:
do_something(fname)
从getopt或optparse获取您的目录。 此外,如果需要,可以使用os.path.abspath构建绝对路径。
current_file = "%s%s%s" % (os.path.abspath(root), os.path.sep, fname)
do_something(current_file)
答案 2 :(得分:4)
os.walk()
听起来可能会在这里发挥作用。
def traverse_and_touch(directory, touch):
'''
General function for traversing a local directory. Walks through
the entire directory, and touches all files with a specified function.
'''
for root, dirs, files in os.walk(directory):
for filename in files:
touch(os.path.join(root, filename))
return
现在,您需要做的就是传递您想要遍历的目录和一个函数,它将在每个文件上执行代码。
os.walk()
也遍历所有子目录。
答案 3 :(得分:1)
是的,您可以像这样修改它。循环遍历参数而不是索引第一个元素。
答案 4 :(得分:1)
我建议你的'main'应该处理选项后给出的每个文件。也就是说,在“args”变量中。不要使用“-r”传递路径,这限制了您的灵活性。如果在程序中使用os.walk()等,则需要系统仅在文件树上工作,这使得定制和开发变得更加困难。
如果程序使用路径列表,则非常易于以不同方式使用。例如,您可以列出一个数据文件进行测试。要处理目录,请执行“myprogram dir / * .dat”。要处理文件树,请使用反引号:
myprogram `find . -name "*.dat"`
最后你可以做很便宜的并行处理。类似的东西:
find . -name '*.dat' | xargs -P 5 myprogram
您的程序的五个副本并行运行。没有锁定或叉子或螺纹或其他必要的同步。
(上面假设您使用的是Linux / OSX类型系统。)