在sh中打印所有文件

2024-05-15 09:51:45 发布

您现在位置:Python中文网/ 问答频道 /正文

程序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文件?你知道吗


Tags: 文件path命令行inpy程序目录txt
2条回答

由于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])
    

在命令行中,*是一个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

你知道吗(操作系统路径连接是一个实用程序,可以添加/如果需要的话)

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

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"

相关问题 更多 >