2014-02-12 29 views
4

我的目录树:如何通过通配符参数,如* .TXT在窗口在cmd

test/ 
|_____ 1.txt content: 1_line1\n1_line2 
|_____ 2.txt content: 2_line1\n2_line2 
|_____ test_fileinput.py 

我的Python脚本:

import fileinput 
import sys 

for line in fileinput.input(sys.argv[1:]): 
    print(fileinput.filename(), fileinput.filelineno(), line) 

首先我想它在Linux上,因为你看到它完美的作品:

$ python3 test_fileinput.py *.txt 
1.txt 1 1_line1 

1.txt 2 1_line2 
2.txt 1 2_line1 

2.txt 2 2_line2 

但在Windows上:

enter image description here

我当然可以做python test_fileinput.py 1.txt 2.txt,但我不知道有没有,我仍然可以在Windows上通过*.txt的方法吗?谢谢。

+0

一个选项是使用* nix类似的工具,例如Windows 'cygwin' – shx2

+0

@ shx2 cygwin的确可以工作,但这不是我正在寻找的解决方案。 – laike9m

+0

相关:https://stackoverflow.com/questions/12501761/passing-multple-files-with-asterisk-to-python-shell-in-windows –

回答

5

您可以使用glob模块,该模块提供了执行通配符匹配的平台无关方式。例如,glob('*.txt')会返回当前目录中所有txt文件的列表。

import fileinput 
import sys 
from glob import glob 

for line in fileinput.input(glob(sys.argv[1]): 
    print(fileinput.filename(), fileinput.filelineno(), line) 

如果您想保留在那里你可以指定多个输入(这样做python test_fileinput.py *.txt *.csv other.md将是有效的行为)的行为,您可以修改代码如下:

import fileinput 
import sys 
from glob import glob 

all_files = [f for files in sys.argv[1:] for f in glob(files)] 

for line in fileinput.input(all_files): 
    print(fileinput.filename(), fileinput.filelineno(), line) 
+0

glob是伟大的我知道它,但这是从我的'米问。 – laike9m

+0

所以没有办法可以在Windows中使用像glob这样的东西,对吧?如果你确定,那么我会接受你的答案。 – laike9m

+0

@ laike9m - 我很确定使用标准的Windows命令行或Powershell是不可能的。我在网上做了一个粗略的搜索,并且它看起来并不像Windows本身支持通配符扩展。 – Michael0x2a