LoginSignup
0
3

More than 5 years have passed since last update.

Pythonを使ったファイルの命名規則によるソート

Last updated at Posted at 2017-01-14

命名規則の一部によるソート

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

0
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3