2014-02-12 28 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