2014-02-07 38 views
11

我想測試一個簡單的代碼,它逐行讀取Pycharm文件。從pycharm中的sys.stdin文件讀取

for line in sys.stdin: 
    name, _ = line.strip().split("\t") 
    print name 

我我想要的文件輸入在同一目錄:lib.txt

如何調試我在Pycharm代碼輸入文件?

回答

1

您需要創建自定義運行配置,然後將您的文件作爲參數添加到「腳本參數」框中。請參閱Pycharm的online help以獲取分步指南。

但是,即使你這樣做(因爲你已經發現),你的問題將不起作用,因爲你沒有解析正確的命令行參數。

您需要改用argparse

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument("filename", help="The filename to be processed") 
args = parser.parse_args() 
if args.filename: 
    with open(filename) as f:  
     for line in f: 
      name, _ = line.strip().split('\t') 
      print(name) 
+0

當我運行我的代碼,我得到的輸出窗口: 在/ usr/bin中/ Python的/home/training/PycharmProjects/pp12/main.py purch.txt 但沒有任何反應(當我加載相同的代碼工作file with f1 = open('purch.txt') – thecheech

+1

您需要閱讀[解析命令行參數](http://docs.python.org/2/library/optparse.html)。 –

11

您可以解決此問題,如果您使用的FileInput模塊,而不是試圖標準輸入直接讀取。

對於fileinput,如果腳本在參數中接收到文件名,它將按順序從參數中讀取。在你的情況下,更換上面的代碼:

import fileinput 
for line in fileinput.input(): 
    name, _ = line.strip().split("\t") 
    print name 

有關的FileInput偉大的事情是,如果沒有提供參數,則默認爲標準輸入(或如果參數「 - 」提供)。

現在您可以創建一個運行配置並提供您想用作st​​din的文件的文件名作爲腳本的唯一參數。

瞭解更多關於fileinput here

3

我一直試圖找到一種方法,使用閱讀文件作爲標準輸入PyCharm。然而,包括噴氣式大腦在內的大多數人都說沒有辦法也沒有支持,這是命令行的特性與PyCharm本身無關。 * https://intellij-support.jetbrains.com/hc/en-us/community/posts/206588305-How-to-redirect-standard-input-output-inside-PyCharm-

其實這個功能,閱讀文件作爲標準輸入,以某種方式必不可少的我,以減輕給輸入從解決hackerank或acmicpc一個規劃問題。

我找到了一個簡單的方法。我可以使用input()從文件中提供stdin!

import sys 
sys.stdin = open('input.in', 'r') 
sys.stdout = open('output.out', 'w') 

print(input()) 
print(input()) 

input.in例如:

hello world 
This is not the world ever I have known 

output.out例如:

hello world 
This is not the world ever I have known 
0

爲了提高靈活性,您可以編寫Python腳本總是從標準輸入讀取,然後使用命令重定向從文件讀取:

$ python myscript.py < file.txt 

但是,據我所知,你不能使用PyCharm的重定向,因爲運行配置不允許它。

或者,你可以接受文件名作爲命令行參數:

$ python myscript.py file.txt 

有幾種方法來解決這個問題。我認爲​​對於這種情況是過分的。或者,你可以用sys.argv直接訪問命令行參數:

import sys 

filename = sys.argv[1] 
with open(filename) as f:  
    for line in f: 
     name, _ = line.strip().split('\t') 
     print(name) 

對於健壯的代碼,你可以檢查給出正確的參數個數。