質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

274閲覧

車両の名称ごとにファイルを分割する

shin_shin

総合スコア96

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2018/02/05 02:57

現在、ある車両の情報を扱っています。
これから、車両の種類ごとに、分析に入ります。

なので、最初に、フォルダに入っている計1000個のテキストファイルを車両の名称ごとに分類し、別々のフォルダに保存したいです。そのコードを教えていただきたいです。

前提:
(1)車両がいくつあるのか?どんな名称なのか?はわからない。
→つまり、事前に自分で、ある特定のフォルダを手動で作ることはできない。
(2)車両名称を参照する場所(行と列)は、わかる。
→df.loc[1,"name"]に必ずある

私が考えている流れ:
(1)1000個のファイルの一つ一つにdf.loc[1,"name"]を参照し、その名称をset()に格納し、重複のない車両名称を得る。その後、手動でフォルダを作る。
(2)その後は、if文で名称に合わせて、作成したフォルダに格納していく。

python

1import glob 2import os 3import pandas as pd 4#カレントディレクトリの設定 5os.chdir("share_folder/") 6#共有フォルダから、すべてのファイルパスの取得 7filepath = glob.glob("*.txt") 8#車両情報の名称を取得 9unique_names = [] 10for i in range(len(filepath)): 11 df = pd.read_table(filepath[i], sep=",") 12 names = set(df.loc[1,"name"]) 13 unique_names.append(names) 14########################################## 15#######名称の数だけ、フォルダを作る######### 16########################################## 17 18#フォルダを分類する 19for i in range(len(filepath)): 20 df = pd.read_table(filepath[i]) 21 if df.loc[1,"name"] == "ファイル名称1": 22 df.to_csv("filepath[i]", sep=",") 23 elif df.loc[1,"name"] == "ファイル名称2": 24 df.to_csv("filepath[i]", sep=",") 25 else df.loc[1,"name"]: 26 df.to_csv("desktop/Nan/filepath[i]", sep=",")

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

車両名称でディレクトリが存在するか調べて、
存在しないなら、ディレクトリを作成して、
そのファイルを車両名称のディレクトリに移動する。

これでだめですか?

投稿2018/02/05 03:13

iwanote

総合スコア295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

他の方の回答で答えは出ていますが。

最初に、フォルダに入っている計1000個のテキストファイルを車両の名称ごとに分類し、別々のフォルダに保存したいです。

やりたいことはファイルのコピーですか?それともファイルの移動ですか?
質問文に記載しているコードはdf.to_csvなためファイルのコピーを行いますが。

以下はディレクトリを作成してファイルを移動するサンプルです。

Python

1# -*- coding: utf8 -*- 2import glob 3import os 4import pandas as pd 5from pathlib import Path 6import shutil 7 8 9def move_files(base_dir: Path, file_path: list) ->None: 10 for f in file_path: 11 src = Path(f) 12 # ※3 13 df = pd.read_table(f, sep=",", engine='python') 14 # ※4 15 dst_dir = Path(base_dir, df.loc[1, "name"]) 16 dst_dir.mkdir(parents=True, exist_ok=True) 17 dst = dst_dir.joinpath(src.name) 18 # ファイルのメタデータを保持しつつコピー 19 # shutil.copy2(str(src), str(dst)) 20 # ファイルを移動 21 os.replace(str(src), str(dst)) 22 23 24def main() -> None: 25 base_dir = Path("share_folder") 26 # ※1 27 file_path = glob.glob(str(base_dir.joinpath("*.txt"))) 28 # ※2 ファイル一覧をソート! 29 # file_path = sorted(file_path) 30 move_files(base_dir, file_path) 31 32 33if __name__ == '__main__': 34 main() 35

■質問文のスクリプトで怪しい点。
1,os.chdirでカレントディレクトリを移動するとスクリプトが終了するまで対象のディレクトリに対して共有ロックを行うため避けたほうが良いです。

Python

1os.chdir("share_folder/")

glob.globの引数にパスと検索パターンを指定するとそのフォルダ直下を検索してくれます。

Python

1glob.glob("share_folder/*.txt")

2,globの結果をソートしていないため、ファイルの処理順は保証されませんが、保証しなくても大丈夫ですか?glob結果に対してソートを行うと処理順が保証されます。
3,質問文にサンプルデータが提示されていないので、以下は推測になってしまいますが、
「車両名称」とのことなので、日本語だと思いますが。pandas#read_tableは環境によっては日本語ファイル名を許容しません。
日本語ファイル名の読み込みを行いたい時はpd.read_tableの引数にengine='python'
を追加してくださいな。
4,df.loc[1, "name"]の場合df.locは0オリジンで始まってるので、2行目(ヘッダーを含むと3行目)を読み込みますが車両名称の位置は認識相違ないでしょうか?

投稿2018/02/05 15:24

編集2018/02/05 18:20
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問