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

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

ただいまの
回答率

90.11%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 563

shin_shin

score 72

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

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

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

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

import glob
import os
import pandas as pd
#カレントディレクトリの設定
os.chdir("share_folder/")
#共有フォルダから、すべてのファイルパスの取得
filepath = glob.glob("*.txt")
#車両情報の名称を取得
unique_names = []
for i in range(len(filepath)):
   df = pd.read_table(filepath[i], sep=",")
   names = set(df.loc[1,"name"])
   unique_names.append(names)
##########################################
#######名称の数だけ、フォルダを作る#########
##########################################

#フォルダを分類する
for i in range(len(filepath)):
   df = pd.read_table(filepath[i])
   if df.loc[1,"name"] == "ファイル名称1":
      df.to_csv("filepath[i]", sep=",")
   elif df.loc[1,"name"] == "ファイル名称2":
      df.to_csv("filepath[i]", sep=",")
   else df.loc[1,"name"]:
      df.to_csv("desktop/Nan/filepath[i]", sep=",")


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

これでだめですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

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

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

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

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

# -*- coding: utf8 -*-
import glob
import os
import pandas as pd
from pathlib import Path
import shutil


def move_files(base_dir: Path, file_path: list) ->None:
    for f in file_path:
        src = Path(f)
        # ※3
        df = pd.read_table(f, sep=",", engine='python')
        # ※4
        dst_dir = Path(base_dir, df.loc[1, "name"])
        dst_dir.mkdir(parents=True, exist_ok=True)
        dst = dst_dir.joinpath(src.name)
        # ファイルのメタデータを保持しつつコピー
        # shutil.copy2(str(src), str(dst))
        # ファイルを移動
        os.replace(str(src), str(dst))


def main() -> None:
    base_dir = Path("share_folder")
    # ※1
    file_path = glob.glob(str(base_dir.joinpath("*.txt")))
    # ※2 ファイル一覧をソート!
    # file_path = sorted(file_path)
    move_files(base_dir, file_path)


if __name__ == '__main__':
    main()

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

os.chdir("share_folder/")


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

glob.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行目)を読み込みますが車両名称の位置は認識相違ないでしょうか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る