【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 함수의 두 번째 인수)
옵션의 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
기타 비망록 · 메모
Reference
이 문제에 관하여(【Python】서브 폴더를 포함해 폴더내를 주사→파일 리스트를 CSV내보내기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hisakichi95/items/94231e90d8d3b0652ec8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)