python:迭代更改sys.argv

时间:2014-09-28 22:12:19

标签: python argument-passing

我确信这是一个常见的问题,但我是一个蟒蛇新手,我不知道如何搜索这个问题。

我有一个像这样的函数的脚本:

firstarg = sys.argv[1]
secondarg = sys.argv[2]

def examplefunc(firstarg):
    #does something
#returns something

def example2(firstarg, secondarg):
    #also does something and returns something

我有一个包含大量txt文件的文件夹。对于第一个示例函数,我想循环遍历所有这些txt文件并将答案打印到一个新文件中(即将每个txt文件作为firstarg传递)。类似地,对于第二个函数,我想将第一个参数修复为一个特定的txt文件,而第二个参数循环遍历所有剩余的txt文件。

我知道如何使用这样的参数运行python命令的唯一方法是在我的终端中运行以下形式:

  
    

python myscript.py ./txtfile1 ./txtfile2

  

然后相应地更改参数。我相信有更好的方法。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

如果要获取目录中所有文件的列表,有两种方法可以做到。

首先,从Python之外,只需执行此操作:

python myscript.py txtfile1 *

现在,您的sys.argv将类似于['myscript.py', 'txtfile1', 'txtfile1', 'txtfile2', 'txtfile3', 'txtfile4']。因此,如果您想在每个文件上运行examplefunc,然后针对每个文件在example2上运行txtfile1

special_file = sys.argv[1]
everything_else = sys.argv[2:]
for filename in everything_else:
    examplefunc(filename)
for filename in everything_else:
    example2(special_file, filename)

但你也可以从里面的 Python中做到这一点。传入目录而不是一堆文件,例如python myscript.py txtfile1 .。然后,您的sys.argv将为['myscript.py', 'txtfile1', '.'],您可以执行此操作:

special_file = sys.argv[1]
everything = os.listdir(sys.argv[2]))

答案 1 :(得分:1)

首先,不要将文件名作为参数传递。使用os.walk获取目录中所有.txt文件的列表,然后您可以轻松读取文件并在Python代码中循环显示这些文件。

答案 2 :(得分:0)

更好的方法是从程序中迭代遍历目录中的每个文件:

import os

def file_iterator(dir_to_traverse):
    for path,dirs,files in os.walk(dir_to_traverse):
        for f_name in files:
            yield os.path.join(path,f_name)
        break

for file_name in file_iterator('.'):
    print file_name