2017-06-12 3 views
0

親愛なるすべて私はあなたの助けが必要です。私のフォルダとサブフォルダを並べ替えるコード部分を書かなければならないとき、あなたはとても親切で、私に説明することができますか?どこでPythonコードのフォルダとサブフォルダにソート機能を適用する必要がありますか?

イメージでは、私のフォルダ&サブフォルダ構造:folderssubfoldersを見ることができます。私はすべてのフォルダとサブフォルダが、 '1'、 '2'、...、 '10'、 '11'、整数の通常の昇順スタイルを持つようにしたい

...

私が思いました一部にコードを入力してください:

zoom_levels = [i for i in sorted(range(zoom_min, zoom + 1), key=int)] 
folders_for_xtiles = [k for k in sorted(range(0, 2 ** zoom), key=int)] 
for zoom_level, folder_for_xtile in itertools.product(zoom_levels, folders_for_xtiles): 
    os.makedirs(os.path.join(path_to_tiles_folder, str(zoom_level), str(folder_for_xtile))) 

しかし、それは動作しませんでした。

それから私は、私はコードで私のフォルダに掘るときソート機能を置くことを考えていたが、私はosモジュールから適用する必要があるメソッドの種類がわからない?:

for zoom_level in range(zoom_min, zoom + 1): 
    xtile_path = os.path.join(path_to_tiles_folder, str(zoom_level)) 
    for xtile_number in range(0, 2 ** zoom): 
     ytile_path = os.path.join(xtile_path, str(xtile_number)) 

ありがとうございましたすべて

+1

IDE内のフォルダのみを監視していますか、または何らかの順序でそれらを読み取る内部コードがありますか?私はPythonがあなたのIDEがフォルダを表示する順番を変更するために何かを行うことができるのかどうかはわかりません(おそらくそれは自分のソートです)。他のコードがファイルを読み込む順序を制御することができます(ファイルシステムに依存します)。 – Blckknght

+0

実際に動作するかもしれないあなたの詳細な説明をありがとう。はい、Pycharm IDEのフォルダの順番を見ています。たぶんそれはIDEにしか関心がないかもしれません。なぜなら、この構造をWindowsで開いている通常のフォルダから開くと、ソートされて表示されるからです。 –

答えて

1

ほとんどのOSは、フォルダ内のファイルを表示する順番を強く保証していません。いくつかのファイルシステムは予測可能な順序(作成日によるソートなど)を持っているかもしれませんが、ほとんどのOSは複数の異なるファイルシステムをサポートしています。代わりに、通常、各クライアントプログラムは、ファイル名を読み取って自分自身をソートします。順序が気になる場合は、低レベルのプログラムの多くは順序を気にしません。 OSデザイナー(必要がないときにファイル名をソートするオーバーヘッドをかけたくない人)。

この問題は、実際にはPythonコードに問題はありません。むしろ、あなたがおそらく変更することができないIDEの問題です。辞書順に作成したフォルダを並べ替えます。102の前にあり、はアルファベット順の前に来ます。あなたのIDEにソート方法を変更する機能がないかぎり(おそらくそう思わない)、おそらくそれを直接修正することはできません。

OSによって提供されるファイルマネージャでは、ソート方法が異なる場合があります(ソート方法のオプションが増えます)。多くのプログラムは、ファイル名に「自然な並べ替え」と呼ばれるものを使用します。これは、名前を数字部分と非数字部分に分け、それぞれをソートの別々のステップとして使います(対応する数字部分を辞書順ではなく数値でソートします)。フォルダを表示するために独自のコードを作成していた場合は、そのフォルダを複製する必要がありますが、現状では必要ではないようです。

名前をゼロパッドするのに役立つものは何ですか? 12という名前のフォルダを作成するのではなく、0102を作成します。そして、素朴な並べ替えでは、12の間に入れないで、09の後に10を入れます。ここでは、ゼロ詰めの数字で動作するようにあなたのフォルダの作成ロジックを変更することができます方法は次のとおりです。

zoom_levels = [i for i in range(zoom_min, zoom + 1)] 
folders_for_xtiles = [k for k in range(0, 2 ** zoom] 
for zoom_level, folder_for_xtile in itertools.product(zoom_levels, folders_for_xtiles): 
    os.makedirs(os.path.join(path_to_tiles_folder, 
          format(zoom_level, '02'), 
          format(folder_for_xtile, '02'))) 

主な変更点は、文字列に数値を回すためにformatの代わりstrを使用することです。 02の書式設定コードを渡して、数字を2桁の数字の先頭に0をつけるようにPythonに指示します。何もしていないので、リスト内包表記からsorted呼出しを取り除いたことに注意してください(rangeは、私たちの目的にとって本当に重要ではなく昇順で結果を生成しています)。

あなたが表示する最後のコードブロックは、フォルダにアクセスするときに、フォルダを参照して、それぞれに表示される名前をOSに尋ねるのではなく、番号で直接名前を再作成することを示しています。あなたがそうしている場合、フォルダが作成された順序(または別のプログラムで表示されたときの順序)を気にする必要はありません。番号を順番に生成すると、順番にフォルダにアクセスします。あらかじめ名前を知っているので、ファイルシステムにどのようなフォルダがあるかをファイルシステムに尋ねていないので、ファイルシステムがどのような順序で提供するかは関係ありません。

+0

あなたの詳細で明白で理解できる答えに感謝します!私は本当にそれを感謝します! –

1

これはPythonの動作ではなく、OSの動作に似ているようです。 1から9までのフォルダ名にゼロを埋めてください。例:

for zoom_level in range(zoom_min, zoom + 1): 
    xtile_path = os.path.join(path_to_tiles_folder, str(zoom_level)) 
    for xtile_number in range(0, 2 ** zoom): 
     xtile_folder_name = str(xtile_number).zfill(2) if len(str(xtile_number)) == 1 else str(xtile_number) 
     ytile_path = os.path.join(xtile_path, xtile_folder_name) 
関連する問題