2

ファイル名がディレクトリにあるときにファイル名を並べ替える方法を知りたいです。たとえば、次の名前があります。

1_00000_6.54.csv
2_00000_1.70.csv
3_00000_1.70.csv
...
10_00000_1.70.csv
11_00000_1.70.csv
...

次の python コードを使用すると、次の順序になります。

 def get_pixelist(path):
     return [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.csv')]

 def group_uniqmz_intensities(path):
     pxlist = sorted(get_pixelist(path))

与えます:

1_00000_6.54.csv
10_00000_1.70.csv
11_00000_1.70
...
2_00000_1.70.csv
...
3_00000_1.70.csv
...

前に示した順序が必要です。

4

4 に答える 4

2

最も簡単な方法は、並べ替え時にファイル名をゼロで埋めることです。

def group_uniqmz_intensities(path):
    pxlist = sorted(get_pixelist(path), key=lambda f: f.rjust(17, '0'))

0これにより、ソート時に各ファイル名が 17 文字にパディングされます。so1_00000_6.54.csvはパディングされますが01_00000_6.54.csv10_00000_1.70.csvはそのままです。辞書的に、 の01前に並べ替え10ます。

単純化するためにハードコーディングされた値として 17 を選びました。代わりにこれを使用して、必要な値を自動的に見つけることができます。

def group_uniqmz_intensities(path):
    padsize = max(len(f) for f in pxlist)
    pxlist = sorted(get_pixelist(path), key=lambda f: f.rjust(padsize, '0'))
于 2013-01-30T10:28:24.753 に答える
0

英数字の並べ替えに関するこの回答に基づく:

def group_uniqmz_intensities(path):
    pxlist = sorted(get_pixelist(path), key=lambda filename: int(filename.partition('_')[0]))
于 2013-01-30T10:37:46.100 に答える
0

フィールドがすべて で分割されていると仮定して、自然順序付けの簡単な実装を次に示します_

def int_if_possible(s):
    try:
        return int(s)
    except:
        return s


>>> sorted(s, key=lambda s: map(int_if_possible, s.split('_')))
['1_00000_6.54.csv',
 '2_00000_1.70.csv',
 '3_00000_1.70.csv',
 '10_00000_1.70.csv',
 '11_00000_1.70.csv']

この実装は、リストが要素ごとに比較されるという事実を利用しています。要素が int に変換できる場合は int として比較し、そうでない場合は文字列比較に戻ります。


編集:自然な並べ替えのより精巧なソリューションがここに示されています:自然な文字列の並べ替え

これは非常に巧妙です。正規表現を使用して、\d+\D+入力文字列を交互の数値と非数値に分割します。次に、数値は数値的に比較され、非数値はアルファベット順に比較されます。

于 2013-01-30T10:40:22.500 に答える
0

'1' < '_' なので、2 番目の順序になります。sorted にキー関数を与えることで、目標を達成できます。

 def group_uniqmz_intensities(path):
     pxlist = sorted(get_pixelist(path), key=lambda x: int(x.split("_")[0]))

すべてのファイルが同じ命名スキーム ({number}_{rest}.csv) に従っていることを確認してください。そうでない場合、ValueError が発生します。

編集: Martijn Pieters は、よりエレガントなソリューションを提供します。

于 2013-01-30T10:32:44.530 に答える