2017-04-22 165 views
0

我在我的代碼中使用了sys.stdin,並且想知道如何在多個文本文件上測試我的代碼。 我的代碼(test.py)是:如何使用sys.stdin作爲多個文本文件的輸入運行代碼

for line in sys.stdin: 
    line = line.strip() 
    words = line.split() 

我想測試它在2個文本文件,所以我在終端上鍵入:

echo "test1.txt" "test2.txt" | test.py 

,但它不工作,所以我只想知道如何測試2個文本文件的代碼?

+1

你是否期待它被空間分割? –

+1

你是什麼意思,它不起作用,你得到了什麼,你期望什麼? – AChampion

+0

test.py是否期望文件名或文件內容?在後一種情況下,您應該使用'cat',而不是'echo'。 – DyZ

回答

1
echo "test1.txt" "test2.txt" | test.py 

不會實際運行test.py,你需要使用這個命令:

echo "test1.txt" "test2.txt" | python test.py 

然而,對於越來越參數到蟒蛇另一種方法是:

import sys 
for arg in sys.argv: 
    print line 

,當像這樣運行:

python test.py "test1" "test2" 

產生以下輸出:

test.py 
test1 
test2 

argv第一個參數是該程序的名稱。這可以被忽略:

import sys 
for arg in sys.argv[1:]: 
    print line 

你似乎有被你假設Python是打開你交給它在循環中的文本文件的另一個問題 - 這是不正確的。如果你在循環中打印,你會看到它只是打印你最初給它的字符串。

如果你真的想打開並解析文件,做這樣的事情在循環:

import sys 

args = sys.stdin.readlines()[0].replace("\"","").split() 
for arg in args: 
    arg = arg.strip() 
    with open(arg, "r") as f: 
     for line in f: 
      line = line.strip() 
      words = line.split() 

的原因,我們有一個奇怪的第一行是stdin是一個流,所以我們必須要讀它通過readlines()

結果是隻有一個元素的列表(因爲我們只給它一條線),因此德[0]

然後我們需要取出內引號,因爲引號是不是真的需要時管道,這也將起作用:

echo test1.txt test2.txt | python test.py 

最後,我們必須將字符串拆分爲實際的文件名。

+0

謝謝!我將代碼更改爲您提供的最後一個循環,並通過類型運行它:python test.py「test1.txt」,但它最終會出現錯誤,如沒有這樣的文件或目錄:'test1.txt \ n'帶有一個奇怪的'\ N」。我確實把test1.txt和py文件放在同一個文件夾中。那麼我可以問一下如何解決這個問題? –

+0

注意:'| test.py'可以工作,只要你有合適的shebang,例如'#!/ usr/bin/env python'和適當的權限'chmod + x test.py' – AChampion

+0

非常感謝,現在它適用於單輸入文件。但是,當我嘗試將其應用於多個文件時:echo「test.txt」「eco.txt」| python test.py,它返回如下錯誤:沒有這樣的文件或目錄:'test.txt eco.txt'。請問如何避免這個問題? –

相關問題