命名規則の一部によるソート
test.csv
001_0004_1.bmp
002_0004_1.bmp
003_0004_1.bmp
004_0003_1.bmp
005_0003_1.bmp
006_0003_1.bmp
007_0002_1.bmp
008_0002_1.bmp
009_0002_1.bmp
010_0001_1.bmp
011_0001_1.bmp
012_0001_1.bmp
上記のtest.csvの中身のようなファイル名があるとします.
このCSVに記載されているBMPファイルには以下のような命名規則があります(適当に作った命名規則です),
FFF_TTTT_C.bmp
- F:フレーム番号
- T:なにかしらのインデックス
- C:写っているモノのインデックス
- 上記の番号・インデックスが'_'で区切られている
上記のCSVファイルの中身は,フレーム番号でソートされていますが,
なにかしらの理由で,
「Tのなにかしらのインデックスでソートしたい!」
という場合が出てきた時のソートを想定しています.
考え方
1.CSVからファイル名を読み込む
2.読み込んだファイルを'_'で分割
3.分割した一部の番号を使用してソート
4.リストの形を整えてCSVへ出力
という考えでプログラムを作成しました.
よく検索すれば,関数いっぱつドーン!でできそうな気もしますが...
ソースコード
##
# coding:utf-8
##
import csv
import pprint as pp
##
# 命名規則によるソート
# inputlist:ソート対象のリスト
# key_number:何番目の文字列でソートするか指定
# key_numberが命名規則の分割数を超える場合は空リストを返す
##
def Sort_by_Key(input_list,key_number,split='_'):
# ファイル名を分割して,タプル形式に変換する
file_sort = []
for t in input_list:
sp_t = t.split(split)
tap_sp_t = tuple(sp_t)
file_sort.append(tap_sp_t)
if len(file_sort[0]) < key_number:
return []
# ソート
file_sort.sort(key=lambda t: t[key_number])
# 分割したのをくっつける
output_file = []
for f in file_sort:
s = split.join(f)
output_file.append(s)
return output_file
def main():
# ファイル読み込み
op = open('test.csv','r')
tpp = csv.reader(op)
# csvの1列目だけ抜き出す
test_file = []
for t in tpp:
test_file.append(t[0])
op.close()
# もともとの並び順
print("before")
pp.pprint(test_file)
file_save = Sort_by_Key(test_file,1)
print("\nafter")
pp.pprint(file_save)
#保存用変換
row = len(file_save)
col = 1
SaveList = [file_save[col * i: col * (i + 1)] for i in range(row)]
wp = open('output.csv','w')
writer = csv.writer(wp, lineterminator='\n')
writer.writerows(SaveList)
wp.close()
if __name__=="__main__":
main()
output.csv
010_0001_1.bmp
011_0001_1.bmp
012_0001_1.bmp
007_0002_1.bmp
008_0002_1.bmp
009_0002_1.bmp
004_0003_1.bmp
005_0003_1.bmp
006_0003_1.bmp
001_0004_1.bmp
002_0004_1.bmp
003_0004_1.bmp
参考サイト
[1] PythonでCSVの読み書き
[2] Python入門 - リスト・タプル・辞書
[3] Python: オブジェクトのソートについて
[4] Pythonで文字列を連結・分割する:join(), split()
[5] convert a flat list to list of list in python
[6] ライブラリ:pprint