2011-06-20 7 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

アイテムを列挙してインデックスで印刷できます。あなたはその後、dirlistに正しいインデックスにuserchoiceを変換するためにindexMappingを使用することができます

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 

:あなたは、実際の指数はギャップがあっても、ユーザーに連続番号を表示するマッピングを使用することができます。

+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行にするべきではありません。ワンライナーは、理解が難しく、デバッグが難しい場合もあります。さらに、あなたのコードでは、ユーザーが入力エラーを起こさないと仮定しています。しかし、私はこのコードが単なる例示であることを理解しています。 –

+1

私は実際に私の解決策以上のものが好きです。 –

+0

@ブライアン・オークリー:そうだよ。 –

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' 
関連する問題