2011-06-20 61 views
2

我試圖找到最簡單的方法來枚舉列表中的項目,以便用戶將不負擔相應的命令行上鍵入長文件名的數值。下面的函數顯示了用戶文件夾中的所有.tgz的和的.tar文件...該用戶隨後可以進入他要提取的文件的名稱。這對用戶來說很乏味且容易出現語法錯誤。我想爲用戶只需選擇,比方說,與該文件(例如.. 1,2,3等)相關聯的數值。有人可以給我一些方向嗎?謝謝!枚舉的項目,以便用戶可以選擇

dirlist=os.listdir(path) 

    def show_tgz(): 
    for fname in dirlist: 
      if fname.endswith(('.tgz','.tar')): 
      print '\n' 
      print fname 

回答

3

您可以枚舉這些項目並使用索引打印它們。您可以使用一個映射,以顯示連續號碼給用戶,即使實際指標有差距:

def show_tgz(): 
    count = 1 
    indexMapping = {} 
    for i, fname in enumerate(dirlist): 
     if fname.endswith(('.tgz','.tar')): 
      print '\n{0:3d} - {1}'.format(count, fname) 
      indexMapping[count] = i 
      count += 1 
    return indexMapping 

然後可以使用indexMappingdirlist的userchoice轉化爲正確的索引。

+0

我將如何翻譯indexMapping。另外,我應該從show_tgz()函數內提示用戶嗎? – suffa

3
def gen_archives(path): 
    names = os.listdir(path) 
    for name in names: 
     if name.endswith(('.tgz', '.tar')) 
      yield name 

for i, name in enumerate(gen_archives(path)): 
    print "%d. %s" % (i, name) 
8

開始對文件的列表:

files = [fname for fname in os.listdir(path) 
       if fname.endswith(('.tgz','.tar'))] 

現在你可以從字面上enumerate他們:

for item in enumerate(files): 
    print "[%d] %s" % item 

try: 
    idx = int(raw_input("Enter the file's number")) 
except ValueError: 
    print "You fail at typing numbers." 

try: 
    chosen = files[idx] 
except IndexError: 
    print "Try a number in range next time." 
+2

你不應該把最後一行作爲一行。單線運動員有時可能很難理解,也很難調試。此外,您的代碼假定用戶不會輸入錯誤。雖然,我知道這個代碼只是爲了說明的目的。 –

+1

我其實比我的解決方案更喜歡這個。 –

+0

@Bryan奧克利:我做到了更好的所有權利。 –

3

我真的很喜歡Jochen's answer,但不喜歡多嘗試/除外。這裏有一個使用dict的變體,它會循環直到進行有效的選擇。

files = dict((str(i), f) for i, f in 
       enumerate(f for f in os.listdir(path) if f.endswith(('.tgz','.tar')))) 
for item in sorted(files.items()): 
    print '[%s] %s' % item 
choice = None 
while choice is None: 
    choice = files.get(raw_input('Enter selection')) 
    if not choice: 
     print 'Please make a valid selection'