【问题标题】:python: iteratively change sys.argvpython:迭代更改 sys.argv
【发布时间】:2014-09-28 22:12:18
【问题描述】:

我确定这是一个常见问题,但我是一个 python 新手,我不知道如何搜索这个问题。

我有一个脚本,其功能如下:

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

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

【问题讨论】:

    标签: python argument-passing


    【解决方案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]))
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 除非你真的想递归地走,否则不要使用os.walk。使用listdir
      【解决方案3】:

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

      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
      

      【讨论】:

      • '.'指当前目录。如果您在 Windows 上,您可以指定任何目录,例如 'C:\\Documents and Settings\\xx\\My Documents\\Some Dir'。注意使用双反斜杠,因为单个反斜杠是用于打印特殊字符的字符串转义字符。
      • 在 Windows 上使用原始字符串或正斜杠通常比双斜杠更受欢迎。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      • 2015-04-07
      • 2013-04-03
      • 2014-05-24
      • 2012-11-19
      相关资源
      最近更新 更多