0

ターゲット ディレクトリ内の最大 20 個のファイルを一覧表示するスクリプトを作成しています。ファイルを取得したら、サイズを計算して、人間が判読できる正しいサイズ情報 (Kb、Mb、Gb) を適用します。

ただし、これは順序が狂っています。どうすればこれを行うことができ、ソート順をそのまま維持できますか?

#! /usr/bin/env python

import operator, os, sys

args = sys.argv
if len(args) != 2:
    print "You must one enter one directory as an argument."
    sys.exit(1)
else:
    target = args[1]

data = {}
for root, dirs, files in os.walk(target):
   for name in files:       
       filename = os.path.join(root, name)
       if os.path.exists(filename):
            size = float(os.path.getsize(filename))
            data[filename] = size

sorted_data = sorted(data.iteritems(), key=operator.itemgetter(1), reverse=True)
total = str(len(sorted_data))

while len(sorted_data) > 20:
    sorted_data.pop()

final_data = {}
for name in sorted_data:
    size = str(name[1])
    if size >= 1024:
        size = round(float(size) / 1024, 2)
        if size >= 1024:
            size = round(size / 1024, 2)
            if size >= 1024:
                size = round(size / 1024, 2)
                size = str(size) + "Gb"
            else:
                size = str(size) + "Mb"
    else:
        size = str(size) + "Kb"
    final_data[name] = size

print "The 20 largest files are:\n"
for name in final_data:
    print str(final_data[name]) + " " + str(name)
print "\nThere are a total of " + total + " files located in " + target
4

2 に答える 2

2

問題は、変更されたファイルサイズデータを保存するための新しい辞書を作成することです。そのディクショナリにはファイルサイズに関する情報が含まれておらず、ディクショナリには情報が固定された順序で格納されていないため、ソート順が失われます。しかし、回復するのは簡単です。人間が読める形式のファイルサイズにアクセスするために使用して、をsorted_data超えるのではなく、単に繰り返すだけです。だからこのようなもの:final_datafinal_data

for filename, size in sorted_data:
    print filename, final_data[filename]

しかし、さらに良い解決策は、人間が読める文字列生成コードを関数に入れることです!

def human_readable_size(size):
    # logic to convert size
    return hr_size

これで、辞書を作成する必要さえありません。

for filename, size in sorted_data:
    print filename, human_readable_size(size)
于 2012-04-28T21:39:43.603 に答える
0

私はあなたがすでに解決策を持っていることを知っています、私はただ退屈していて、あなたのロジックをもう少しクリーンアップできるかどうかを見たかったのです。これがあなたのコードの単純化されたバージョンです。

本当に、口述を気にしないでください、彼らはここで何の利益も提供しません。

import operator, os, sys

if len(sys.argv) != 2:
  sys.exit(1)

target = sys.argv[1]

vals = []
for root, dirs, files in os.walk(target):
  names = (os.path.join(root, name) for name in files)
  vals.extend([ (name, float(os.path.getsize(name)))
                for name in names if os.path.exists(name)])

vals = sorted(vals, key=operator.itemgetter(1), reverse=True)

converted = []
for name, size in vals[0:20]:
  if size >= 1024*1024*1024:
    unit = "Gb"
    size /= 1024*1024*1024
  elif size >= 1024*1024:
    unit = "Mb"
    size /= 1024*1024
  elif size >= 1024:
    unit = "Kb"
    size /= 1024
  else:
    unit = "b"
  converted.append((name, "%.2f"%size + unit))

for name, size in converted:
  print size + " " + name
于 2012-04-28T21:59:31.127 に答える