【问题标题】:Using argparse, how can I put the user input into a list?使用 argparse,如何将用户输入放入列表中?
【发布时间】:2015-09-17 18:24:51
【问题描述】:

我需要文件路径,而os.path.dirname 没有给我完整的路径(它不包括文件本身——例如home/a/b 而不是home/a/b/filename)。我还需要文件名,以便稍后打印。由于用户输入的参数是文件名,因此我需要一种将输入存储到列表中的方法。

import sys
import argparse
import inspect, os
import os.path

file_list = []

if __name__ == '__main__':
    parser = argparse.ArgumentParser()      
    parser.add_argument('file', type=argparse.FileType('r'), nargs='*')
    args = parser.parse_args()

    for f in args.file:
        with f:
            data = f.read()
            print data
            x = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
            print x
            file_list.append(x+#I need the filename here)

【问题讨论】:

    标签: python list file argparse os.path


    【解决方案1】:

    怎么样

    os.path.realpath(f.name)
    

    这结合了当前的 curpwd 和 f.name 中记录的文件名。

    如果这还不够健壮,您可以接受用户的文件名,然后自己打开文件。 FileType 不是必需的。它只是一种方便的类型,在接受输入和输出文件并对其进行简单操作的脚本中最有用。换言之,模仿常见bash 函数的脚本。

    【讨论】:

      【解决方案2】:

      您可以使用os.path.abspath(fl.name) 获取文件处理程序的完整路径, 所以这应该工作:

      import sys
      import argparse
      import inspect, os
      import os.path
      
      file_list = []
      
      if __name__ == '__main__':
          parser = argparse.ArgumentParser()      
          parser.add_argument('file', type=argparse.FileType('r'), nargs='*')
          args = parser.parse_args()
      
          for f in args.file:
              with f:
                  data = f.read()
                  print data
                  full_path = os.path.abspath(f)
                  file_list.append(full_path)
      

      为了将来的参考,还要注意os.path.basename,它只返回路径的名称部分。

      【讨论】:

        【解决方案3】:

        您可以使用os.path.abspath(f.name) 获取用于打开文件f 的绝对文件路径。

        但是,如果您还需要文件路径,那么不将类型转换为文件对象并稍后自己执行此操作可能会更简洁,而不是尝试对打开文件的来源进行逆向工程。这样你就已经有了文件路径列表,例如:

        file_list = []
        
        parser = argparse.ArgumentParser()      
        parser.add_argument('file', nargs='*')
        args = parser.parse_args()
        
        for filepath in args.file:
            x = os.path.abspath(filepath)
            with open(filepath, 'r') as f:
                data = f.read()
                print data
                file_list.append(x)
        

        【讨论】:

        • 谢谢!这正是我所需要的。我确实需要一个文件名列表,但我想我可以通过使用 basename 来获得它……对吗?
        • @varda1316,没错,类似 [os.path.basename(filepath) for filepath in args.file] 应该这样做
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-18
        相关资源
        最近更新 更多