【Python】서브 폴더를 포함해 폴더내를 주사→파일 리스트를 CSV내보내기

첫 게시물입니다.
최근 Python의 공부를 시작해, 어중간한 지식 그대로입니다만 비망록적으로 투고해 가고 싶습니다.
뭔가 조언 등 부담없이 코멘트 받으면 행운입니다.

하고 싶은 일



회사 환경에서 부문의 공유 폴더를 사용하고 있지만, 용량이 작고 곧 가득 차게 된다.
이 폴더에서 어떤 파일이 용량을 차지하고 있는지 가시화하고 싶다.
회사 룰적으로 프리 소프트 사용이 원칙 NG이므로, 공부가 나면 스스로 툴을 만들어 보았다.

공부한 것



1. walk 모듈로 디렉토리 스캔



os.walk로 간단하게 폴더내의 주사를 행할 수 있다.
(VBA의 경우는 재귀 처리를 행할 필요가 있었던 것이, walk를 사용하는 것으로 간단하게 쓸 수 있다)

사용법


for curDir, dirs, files in os.walk(target_folder):상기에서 target_folder_p에 기록 된 폴더를 대상으로 파일 그룹을 files로, 서브 폴더 그룹을 dirs로, 각각이 저장된 폴더를 curDir에 저장한다.
그 후, 그 for 안에서 한층 더 for 중첩해 files나 dirs를 전개해, 처리를 행해 간다.

사용 예:


import os

target_folder = r"C:\Users\aaa\Desktop\写真フォルダ"

for curDir, dirs, files in os.walk(target_folder): 
    for a_file in files:
        print(f"{a_file}はフォルダ:{curDir}に格納されています。")

결과
みかん.jpg はフォルダ:C:\Users\aaa\Desktop\写真フォルダ に格納されています。
りんご.jpg はフォルダ:C:\Users\aaa\Desktop\写真フォルダ に格納されています。
バナナ.jpg はフォルダ:C:\Users\aaa\Desktop\写真フォルダ に格納されています。
犬.jpg はフォルダ:C:\Users\aaa\Desktop\写真フォルダ\動物 に格納されています。
猫.jpg はフォルダ:C:\Users\aaa\Desktop\写真フォルダ\動物 に格納されています。

2. csv 파일로 출력



csv로의 출력은 open 함수로 파일을 열고, csv.writer로 csv로 변환하고, writerow나 writerows로 기입해 간다.

쓰기 방법의 예


import csv

with open出力するファイル名フルパス ,読み込みモード, newline="") as fo:
    CSV_file = csv.writer(fo)
    CSV_file.writerow(["A1", "B1", "C1", "D1"])
    CSV_file.writerow([["A2", "B2", "C2", "D2"],["A3", "B3", "C3", "D3"]])
    CSV_file.writerows([["A4", "B4", "C4", "D4"],["A5", "B5", "C5", "D5"]])

결과:

writerow는 1행분 기입
writerows는 여러 줄을 함께 씁니다.

읽기 모드 (open 함수의 두 번째 인수)
  • "w": 내보내기 전용 (기존 파일이 있으면 내용이 지워지고 쓰여짐)
  • "a": 추가 내보내기(기존 파일이 있는 경우, 끝에 데이터가 기입된다)
  • "x": 새로운 내보내기 만 (기존 파일이 있으면 아무 것도 기록되지 않음)
  • "r":읽기 전용
  • "r+": 읽기/쓰기 양용

  • 옵션의 newline은 아직 잘 모르고 공부중. 다만, 이것을 생략해 버리면 출력했을 때에 데이터가 일행 날아가 되어 버린다.

    아티팩트



    파일 목록 내보내기.py
    import os
    import pathlib
    import csv
    from tkinter import filedialog
    
    # 読み込むフォルダを指定する
    F_path = os.path.dirname(__file__)
    target_folder = filedialog.askdirectory(initialdir=F_path)
    target_folder_path = pathlib.Path(target_folder)
    
    filedata = []
    
    # フォルダ内を操作
    for curDir, dirs, files in os.walk(target_folder_path):
        for a_File in files:
    
            file_size = os.path.getsize(os.path.join(curDir, a_File))
            file_ext = os.path.splitext(a_File)
    
            filedata.append([len(filedata)+1, a_File,file_ext[1], file_size,os.path.join(curDir, a_File)])
    
    # 読み込み結果を表示
    print("No.  ファイル名          拡張子          ファイルサイズ(Byte)          フルパス")
    
    for i in range(len(filedata)):
        print(f"{filedata[i][0]}     {filedata[i][1]}     {filedata[i][2]}     {filedata[i][3]}     {filedata[i][4]}")
    
    # ファイル出力先の確認
    print("読み込んだフォルダの最上階層にCSVでファイル一覧を出力します。\n出力するファイル名を入力してください(拡張子は不要)")
    print("(出力しない場合は空白のままENTERする)")
    csv_name = input("出力ファイル名:")
    
    if csv_name == "":
        print("ファイルを出力しませんでした。")
    
    else:
        # 読み込み結果をファイルに出力
        output_csv_path = os.path.join(target_folder_path, csv_name + ".csv")
    
        with open(output_csv_path, "w", newline="") as fo:
            CSV_file = csv.writer(fo)
            CSV_file.writerow(["No.", "ファイル名","拡張子", "ファイルサイズ(Byte)","フルパス"])
            CSV_file.writerows(filedata)
    
        print(f"次のファイルを出力しました。=> {output_csv_path}")
    

    결과
    No.  ファイル名          拡張子          ファイルサイズ(Byte)          フルパス
    1     きのこたけのこ戦争.jpg        .jpg           118437          C:\Users\aaa\Desktop\写真フォルダ\きのこたけのこ戦争.jpg
    2     たけのこの里.jpg        .jpg           93003          C:\Users\aaa\Desktop\写真フォルダ\たけのこの里.jpg
    3     猫1.jpg        .jpg           31115          C:\Users\aaa\Desktop\写真フォルダ\動物\猫1.jpg
    4     猫2.jpg        .jpg           21160          C:\Users\aaa\Desktop\写真フォルダ\動物\猫2.jpg
    読み込んだフォルダの最上階層にCSVでファイル一覧を出力します。
    出力するファイル名を入力してください(拡張子は不要)
    (出力しない場合は空白のままENTERする)
    出力ファイル名:output
    次のファイルを出力しました。=> C:\Users\aaa\Desktop\写真フォルダ\output.csv
    



    기타 비망록 · 메모


  • 가져올 폴더는 tkinter.filedialog.askdirectory에서 직접 지정할 수 있습니다. 옵션의 initialdir로 본 파일의 위치를 ​​참조하도록(듯이) 했다.
  • 읽은 폴더를 pathlib.Path로 Path형으로 변환하고 있지만, 별도로 변환하지 않아도 출력할 수 있는 것 같다. 만들 때 왜 Path 형식으로 변환했는지 실망.
  • 읽어들인 데이터를 모두 리스트(배열)에 스택 해, 정리해 csv에 출력하고 있다. VBA의 배열과 취급이 다르기 때문에, 어떻게 스택으로 가는지 여러가지 고민했다. append와 extend의 ​​차이라든지. 또한 정리하고 싶습니다.
  • NamPy등의 외부 라이브러리는 exe화했을 때에 파일 사이즈가 무거워져 버릴 것 같기 때문에, 일단 최대한 사용하지 않는다.
  • 파일 사이즈는 os.path.getsize (풀 패스의 파일명)로 취득
  • 확장자는 os.path.splitext (파일명. 풀 패스가 아니어도 가능?)로 취득. 반환 값은 튜플이며 첫 번째 요소에 확장자를 제외한 파일 이름과 두 번째 요소에 확장자가 저장됩니다. 마침표가 여러 개 들어가면 뒤쪽의 마침표가 적용됩니다. (예 : test.png.jpg → test.png와 .jpg로 구분)
  • 좋은 웹페이지 즐겨찾기