2011-03-23 56 views
41

我使用python2.7的raw_input從標準輸入讀取。如何設置raw_input的默認字符串?

我想讓用戶更改給定的默認字符串。

代碼:

i = raw_input("Please enter name:") 

控制檯:

Please enter name: Jack 

用戶應提交與Jack但可以改變(退格鍵),它到別的東西。

Please enter name:參數將是raw_input的提示,該部分不應該由用戶更改。

+0

'是否要繼續?:Y/N [Y]','Y->繼續,'N - >請輸入名稱:'。 – khachik 2011-03-23 09:34:17

+1

[顯示Python輸入可能的編輯默認值?]可能的重複(http://stackoverflow.com/questions/2533120/show-default-value-for-editing-on-python-input-possible) – 2011-03-23 09:36:29

+1

謝謝,這是同樣的問題。顯然,我想要的是不可能使用raw_input和使用readline解決方案不是平臺獨立的... – ifschleife 2011-03-23 09:53:29

回答

-1

試試這個:raw_input("Please enter name: Jack" + chr(8)*4)

backspace的ASCII值是08

+1

'傑克'只是打印,但沒有設置爲默認值。 – buhtz 2016-09-02 19:43:24

+0

@buhtz感謝您指出。請隨時編輯答案。 – dheerosaur 2016-09-03 09:10:43

7

在dheerosaur的答案如果用戶按Enter鍵選擇實際的默認值,它不會被保存爲python認爲它是''字符串,所以擴展了dheerosaur。

default = "Jack" 
user_input = raw_input("Please enter name: %s"%default + chr(8)*4) 
if not user_input: 
    user_input = default 

據透露..退格的ASCII value08

+2

這是一個整潔的伎倆,謝謝。仍然不是我想要的,因爲用戶不能真正改變給定的默認字符串或使用箭頭鍵進行導航。當然,我們可以解決這個問題,但這樣的功能有點超出範圍。 – ifschleife 2011-03-31 09:15:19

+0

不應該是'chr(8)* len(默認)'嗎? – nvd 2016-02-17 12:28:16

+1

'Jack'只是打印出來的,但沒有設置爲默認值。 – buhtz 2016-09-02 19:43:28

4

在有readline平臺上,可以使用下面介紹的方法:https://stackoverflow.com/a/2533142/1090657

在Windows上,你可以使用的msvcrt模塊:

from msvcrt import getch, putch 

def putstr(str): 
    for c in str: 
     putch(c) 

def input(prompt, default=None): 
    putstr(prompt) 
    if default is None: 
     data = [] 
    else: 
     data = list(default) 
     putstr(data) 
    while True: 
     c = getch() 
     if c in '\r\n': 
      break 
     elif c == '\003': # Ctrl-C 
      putstr('\r\n') 
      raise KeyboardInterrupt 
     elif c == '\b': # Backspace 
      if data: 
       putstr('\b \b') # Backspace and wipe the character cell 
       data.pop() 
     elif c in '\0\xe0': # Special keys 
      getch() 
     else: 
      putch(c) 
      data.append(c) 
    putstr('\r\n') 
    return ''.join(data) 

請注意,箭頭鍵不適用於Windows版本,使用時不會發生任何事情。

70

你可以這樣做:

i = raw_input("Please enter name[Jack]:") or "Jack" 

這樣,如果用戶只需按下回車鍵時不輸入任何東西,「我」將被分配「傑克」。

+5

這不適合這個問題。 '傑克'不可編輯。 – buhtz 2016-09-02 19:41:32

+0

但是這是提供默認輸入的常用Unix模式。如果你想接受默認值,只需按回車。 – chubbsondubs 2016-09-05 13:46:27

+1

@chubbsondubs這個問題不是關於_common Unix pattern_。 – buhtz 2016-09-05 20:23:06

3

我只是添加這個,因爲你應該寫一個簡單的函數重用。這裏是一個我寫道:

def default_input(message, defaultVal): 
    if defaultVal: 
     return raw_input("%s [%s]:" % (message,defaultVal)) or defaultVal 
    else: 
     return raw_input("%s " % (message)) 
+0

這不適合這個問題。 – buhtz 2016-09-02 19:41:51

+0

我重新閱讀了這個問題,我仍然認爲它確實如此。你可能想更好地解釋你的位置。 – chubbsondubs 2016-09-05 13:45:31

+0

@chubbsndubs引用問題:「但可以改變(退格)到其他東西」。這意味着用戶應該能夠編輯默認值。 – buhtz 2016-09-05 20:23:56

9

Python2.7的raw_input獲取和設置默認值:

在一個文件將這個稱爲。潘岳:

import readline 
def rlinput(prompt, prefill=''): 
    readline.set_startup_hook(lambda: readline.insert_text(prefill)) 
    try: 
     return raw_input(prompt) 
    finally: 
     readline.set_startup_hook() 

default_value = "an insecticide" 
stuff = rlinput("Caffeine is: ", default_value) 
print("final answer: " + stuff) 

運行程序,它會停止並提出與該用戶:

[email protected] ~ $ python2.7 a.py 
Caffeine is: an insecticide 

光標是在年底,直到「殺蟲劑」不見了用戶按下退格,種類別的東西,然後按下回車:

[email protected] ~ $ python2.7 a.py 
Caffeine is: water soluable 

程序完成這樣的,最後的答案得到用戶鍵入的內容:

[email protected] ~ $ python2.7 a.py 
Caffeine is: water soluable 
final answer: water soluable 

等效於上面,但工作在Python3:

import readline  
def rlinput(prompt, prefill=''): 
    readline.set_startup_hook(lambda: readline.insert_text(prefill)) 
    try: 
     return input(prompt) 
    finally: 
     readline.set_startup_hook() 

default_value = "an insecticide" 
stuff = rlinput("Caffeine is: ", default_value) 
print("final answer: " + stuff) 

什麼是怎麼回事更多信息:

https://stackoverflow.com/a/2533142/445131

+2

這裏唯一的工作和問題答案。謝謝! – buhtz 2016-09-02 19:50:09

+0

這是否應該在Windows中工作呢,還是隻能在Linux上使用? – ChaimG 2017-01-10 17:33:33

+0

*不*在Windows上工作 – 2018-02-12 15:46:55