程序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
文件?
答案 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)
您将看到您的程序应该打印的列表。为避免这种情况,您有以下几种选择:
"/home/Documents/*.txt"
仅传递扩展部分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)
传递两个参数,路径,然后传递扩展名python txt.py /home/Documents/ .txt
,然后将它们连接在一起:
print_all(sys.argv[1]+'*'+sys.argv[2])