前提・実現したいこと
Pythonのコード内で特定のフォルダーにあるcsvをglob.glob()で習得し、for文とlen()でcsvファイルの長さを判別し、100行
以外の時はそのCSVのファイル名をprint()させるというコードの実装を目指しています。
下記の写真の「A.csv」と「D.csv」が100行以上(以下)あるcsvファイルです。
該当のソースコード
Python3
1import pandas as pd 2import glob 3import os 4import numpy as np 5 6def identification_filetype(path): 7 _, ext = os.path.splitext(path) 8 if ext == ".csv": 9 return pd.read_csv(path, encoding="shift-jis") 10 elif ext == ".txt": 11 return pd.read_csv(path, encoding="shift-jis", sep="\t") 12 13os.chdir("C:\Users\For Programming\Documents\Python Scripts\Lencheck\") 14 15csv_files_side=("C:\Users\For Programming\Documents\Python Scripts\Lencheck\*.csv") 16 17csv_files_side_glob = glob.glob(csv_files_side) 18 19list_csv_side = [] 20for f in csv_files_side_glob: 21 basename = os.path.basename(f) 22 a = identification_filetype(f) 23 if len(a) != 100: 24 print(f"{basename}") 25 break 26 elif len(a) == 100: 27 list_csv_side.append(identification_filetype(f)) 28CSV_version_DataFrame_side= pd.concat(list_csv_side)
実現上の課題、解決したい事
実際の用途として、glob.glob()で習得したcsvファイルの中に、100行以外のデータセットがある場合は、elif以下の動作に進まず、該当するcsvファイルを表示させたいのですが、現時点での上記のコードではそれが上手くできません。
list_csv_side = [] for f in csv_files_side_glob: basename = os.path.basename(f) . . . A.csv
というように、100行以外のファイルが実際は2つ(A.csvとD.csv)ある中で、1つ(A.csv)しか表示されないので、該当するファイルを全て表示させたいです。
恐らく、break文の使い方が間違っていると思うのですが、自分で調べてみた範囲では見つけられませんでした。
補足情報(FW/ツールのバージョンなど)
Python3.7
Jupyter NoteBook
お忙しいとは思いますが、よろしくお願いいたします。
情報に不足がありましたら、ご指摘お願いいたします。
「その時点でfor文の処理を止めて」と「該当するファイルを全て表示させたい」が矛盾しているように思えるのですが違いますでしょうか?
すいません矛盾していました。書き直すと
「全ファイルをチェックして、100行以外のファイルがある」→「elifの動作に進まず、100行以外のファイルをprintする」という動作です。
上記の文章の通り、処理を分けるのが良いと思います。全ファイルの行数をチェックして100行以外のファイルがなければ後の処理を実行します。
※ファイルの1行目はヘッダとして扱いその下のデータ行が100行、ということで良いのですよね?
処理を分割する方法で考えてみます。(※以下の認識で大丈夫です)
for f in csv_files_side_glob:
basename = os.path.basename(f)
a = identification_filetype(f)
if len(a) != 100:
print(f"{basename}")
for f in csv_files_side_glob:
basename = os.path.basename(f)
a = identification_filetype(f)
if len(a) != 100:
break
こういう形で2つに区切って考えてみたのですが、どうですか?
(動作する上では恐らく問題ないのですが、もしもう少しスマートなものが何かあれば...?)