打印shell中的所有文件

时间:2014-03-26 04:27:27

标签: python python-2.7 glob

程序txt.py打印出一个目录作为命令行参数并打印特定扩展名的所有文件

def printAll(path):
        for txtFile in glob.glob(path):
        print txtFile

printAll(sys.argv[1])

在命令行中输入python txt.py /home/Documents/*.txt

它仅打印第一个txt文件。 如果我们从命令行传递目录,如何打印该目录中的所有txt文件?

2 个答案:

答案 0 :(得分:2)

在命令行,*是一个shell通配符,你的shell会扩展它,并将一个文件列表传递给脚本,例如:

python txt.py "/home/Documents/1.txt" "/home/Documents/2.txt" "/home/Documents/3.txt"

你只看第一个参数,所以只打印一个文件。

你需要在你的shell中转义*,以便它作为带有星号的单个参数传递给Python。在bash shell中,可能是:

python txt.py "/home/Documents/\*.txt"

编辑:作为替代方案,您可以在命令行中使用目录路径,并在程序中添加*.txt部分,例如

def printAll(path):
    path = path + "/*.txt"
    for txtFile in glob.glob(path):
        print txtFile

printAll(sys.argv[1])

call it with:
$ python txt.py "/home/Documents"

编辑2 :如何在路径中传递示例文件,脚本可以找到文件扩展名相同的文件?它甚至不必存在。这听起来很有趣:

import os, sys

def printAll(path, fileext):
    query = os.path.join(path, '*.' + fileext)

    for someFile in glob.glob(query):
        print someFile

printAll(sys.argv[1], sys.argv[2])

call it with
$ python txt.py /home/Documents txt

(os.path.join是一个添加/如果需要的实用程序)

或者如何在路径中传递示例文件,脚本可以找到具有相同文件扩展名的文件?它甚至不必存在。这听起来很有趣:

import os, sys

def printAll(path):
    searchdir, filename = os.path.split(path)
    tmp, fileext = os.path.splitext(filename)

    path = os.path.join(searchdir, '*'.fileext)

    for someFile in glob.glob(path):
        print someFile

printAll(sys.argv[1])

call it with:
$ python txt.py "/home/Documents/example.txt"

答案 1 :(得分:0)

由于shell的工作方式,您实际上是在传递整个文件列表,但只使用第一个文件。这是因为shell会扩展*字符,然后所有*.txt文件都会传递给您的脚本。

如果您只是在脚本中执行此操作:

for i in sys.argv[1:]:
    print(i)

您将看到您的程序应该打印的列表。为避免这种情况,您有以下几种选择:

  1. 引用您的论据"/home/Documents/*.txt"
  2. 仅传递扩展部分python txt.py /home/Documents/.txt,并在您的脚本中:

    def print_all(path):
        path = path[:path.rfind('/')+1]+'*'+path[path.rfind('/')+1:]
        for i in glob.glob(path):
            print(i)
    
  3. 传递两个参数,路径,然后传递扩展名python txt.py /home/Documents/ .txt,然后将它们连接在一起:

    print_all(sys.argv[1]+'*'+sys.argv[2])