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
4

4 に答える 4

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."
于 2011-06-20T12:23:45.737 に答える
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)
于 2011-06-20T12:22:30.200 に答える
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

次に、 を使用indexMappingして userchoice を の正しいインデックスに変換できdirlistます。

于 2011-06-20T12:21:30.667 に答える
3

私はヨッヘンの答えが本当に好きでしたが、複数の試行/例外が嫌いでした. 代わりに 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'
于 2011-06-20T13:37:55.297 に答える