[Python] 218 フォルダ(ファイル)をまとめて消去する

備忘のためメモ書きしておきます。

コード例
年フォルダ内のフォルダ(ファイル含)を全て消去

import glob,os,shutil

for year in range(1986,2021):
    for f in glob.glob(f'/horse_racing/race_name/{year}/*'):
        if os.path.isdir(f):
            shutil.rmtree(f)

年フォルダ内のファイルを全て消去

import glob,os

for year in range(1986,2021):
    for f in glob.glob(f'/Volumes/DATA_HR/horse_racing/race_name/{year}/*'):
        if os.path.isfile(f):
            os.remove(f)

[Python] 217 複数のCSVファイルから一部を抽出してまとめる

複数のCSVファイルからある行を抽出し、1つのファイルにまとめるコードです。

with文を追記モード(mode = ‘a’)にします。

一連のCSVファイル処理でCSVモジュールの使いやすさを認識しました。

数値データの配列ではなく単なる表として扱うのであれば、pandasよりもこちらの方が適しているように思います。

コード例は[Python]215の図にあるレースファイルから図右下のレース名他を抽出します。

import glob,csv

# 1986年から2020年のレースファイルからレース名他を抽出して競馬場毎にまとめる
for year in range(1986,2021):
    for f in glob.glob(f'/horse_racing/race/{year}/*/*/*.csv', recursive=True):
        file_new = f.split('race/')[0] + 'race_name/' + f.split('race/')[1][:-26] + f'race_n_{year}' + f.split('race/')[1][-26:-24] + '.csv'

        with open (f, mode="r", encoding="shift_jis") as f1:
            with open(file_new, mode="a", encoding="shift_jis") as f2: # 追記モード
                writer = csv.writer(f2)
                for i,row in enumerate(csv.reader(f1)):
                    if i != 0: # 行0の列インデックスは削除
                        if '010101' == f[-10:-4]: # 1回1日1Rだけ列タイトルを書き込み
                            if i == 1: # 列タイトル
                                rows = [e[2:] for e in row[21:30]] + ['raceID']
                                writer.writerow(rows)

                        if '年' in row[21]: # 列21に'年'がある行を書き込み
                            rows = row[21:30] + [f[-20:-4]]
                            writer.writerow(rows)

[Python] 216 フォルダ内ファイルをカウントする

前回記事で扱ったフォルダ内のファイルをカウントしてみました。

os.path.isfile関数でファイルかどうかを一応判定します。

import glob,os

# 1986年から2020年のレースファイルをカウントする
count_all =  0
year_count = []
for year in range(1986,2021):
    count =  0
    for f in glob.glob(f'/horse_racing/race/{year}/*/*/*.csv', recursive=True):
        if os.path.isfile(f):
            count +=1
            count_all += 1
    year_count.append({year:count})

print(count_all)
print(year_count)
--------------------------------------------------

出力
--------------------------------------------------
119460
[{1986: 3274}, {1987: 3283}, {1988: 3307}, {1989: 3335}, {1990: 3353}, {1991: 3389}, {1992: 3399}, {1993: 3425}, {1994: 3429}, {1995: 3417}, {1996: 3407}, {1997: 3433}, {1998: 3443}, {1999: 3415}, {2000: 3451}, {2001: 3448}, {2002: 3452}, {2003: 3449}, {2004: 3452}, {2005: 3438}, {2006: 3453}, {2007: 3453}, {2008: 3436}, {2009: 3453}, {2010: 3454}, {2011: 3444}, {2012: 3454}, {2013: 3454}, {2014: 3431}, {2015: 3454}, {2016: 3454}, {2017: 3455}, {2018: 3158}, {2019: 3452}, {2020: 3456}]

[Python] 215 CSVファイルから必要部分を抽出する

下図のように、レース結果、レース名、レースラップ、列インデックスが混在しているCSVファイルからレース結果のみを抜き出しました。

データベース化のための前処理です。

ちなみにExcel初級者が1ファイル30秒の手作業で処理するとしたら、1日8時間労働、月稼働20日とした場合、約半年かかります。このコードなら12万ファイルが70秒です。

120000ファイル × 0.5分 / 60分 / 8時間 / 20日 = 6.25ヶ月

しかしコードを書く人よりも、我慢強く手作業に取り組む人の方が評価されたりするのですから、日本の組織というのはなかなかのもんです。

import glob
import pandas as pd
import csv

# 1986年から2021年のレースファイルから結果のみを抽出する。/年/競馬場コード/回/*.csv
for year in range(1986,2022):
    for f in glob.glob(f'/horse_racing/race/{year}/*/*/*.csv', recursive=True):
        file_new = f.split('race/')[0] + 'race_result/' + f.split('race/')[1]

        with open (f, mode="r", encoding="shift_jis") as f1:
            with open(file_new, mode="w", encoding="shift_jis") as f2:
                writer = csv.writer(f2)
                for i,row in enumerate(csv.reader(f1)):
                    # 行0の列インデックスは削除
                    if i != 0:
                        # 列0にラップ、ペースが含まれていればTrue
                        word = ['ラップ'in row[0],'ペース'in row[0]]
                        # どちらもFalseであれば列0から列20を書き込みする
                        if not any(word):
                            writer.writerow(row[0:21])

[Python] 214 CSVファイルの空白行を削除する

CSVファイルに空白行がありこれらを削除したい場合、データフレームからの偶数行抽出などではうまくいきません。

CSVファイルをCSVモジュールで読み込み、if文で空白行以外を抽出しながら書き込みをします。

import glob,csv

# 1986年から1990年のレースファイルから空白行を削除したCSVファイルを作成する。/年/競馬場コード/回/*.csv
for year in range(1986,1991,1):
    for f in glob.glob(f'/horse_racing/race_mas/{year}/*/*/*.csv', recursive=True):
        file_new = f.split('race_mas/')[0] + 'race/' + f.split('race_mas/')[1]

        with open (f, mode="r", encoding="shift_jis") as f1:
            with open(file_new, mode="w", encoding="shift_jis") as f2:
                writer = csv.writer(f2)
                for row in csv.reader(f1):
                    if any(row):
                        writer.writerow(row)