Python


❏ 参考書

PythonでExcel、メール、Webを自動化する本

≫ 3-1 CSVファイルを読み込む

◎ CSVファイルを読み込む

◯ for row in reader:

1行分のデータがリストでrowに代入

◯ reader.line_num

1から始まる行番号が取得できる

◯ if reader.line_num <= header_num:

3行目までTrue

◯ continue

ループをスキップ

import csv

# ヘッダー行数
header_num = 3

f = open("4月売上.csv")
reader = csv.reader(f)
for row in reader:
    if reader.line_num <= header_num:
        continue
    print(row)
f.close()
実行結果
['2020/4/1', '株式会社 鈴木商店', '商品C', '1200', '20', '24000']
['2020/4/8', 'サン企画 有限会社', '商品A', '7200', '5', '36000']
['2020/4/14', '株式会社 鈴木商店', '商品A', '7200', '3', '21600']
['2020/4/17', '三和商事 株式会社', '商品B', '3800', '10', '38000']
['2020/4/23', '三和商事 株式会社', '商品C', '1200', '50', '60000']
['2020/4/27', 'サン企画 有限会社', '商品A', '7200', '8', '57600']
['2020/4/30', '株式会社 鈴木商店', '商品B', '3800', '12', '45600']

≫ 3-2 CSVファイルにデータを書き込む

◎ CSVファイルを書き込む

◯ f = open("5月売上.csv", mode="w", newline="")

mode

 "w" :書き込みモード

 "a"  :追加モード(末尾に追加される)

newline="" :二重に改行しない

◯ for data in data_list:

変数data_listには、1行分のデータをセットしたリストを要素として持つリストを代入

◯ writer.writerow(data)

カッコ内に1行分のデータをセットしたリストを入力すると、各要素がCSV形式で書き込まれる。writerow()は1行書き込むごとに改行する

import csv

data_list = [
["売上データ", "", "", "", "", ""],
["", "", "", "", "", ""],
["売上日", "顧客名称", "商品名", "単価", "数量", "計"],
["2020/5/7", "サン企画 有限会社", "商品B", "3800", "10", "38000"],
["2020/5/8", "三和商事 株式会社", "商品A", "7200", "7", "50400"],
["2020/5/11", "株式会社 鈴木商店", "商品C", "1200", "100", "120000"]
]

f = open("5月売上.csv", mode="w", newline="")
writer = csv.writer(f)
for data in data_list:
    writer.writerow(data)
f.close()
実行結果
売上データ,,,,,
,,,,,
売上日,顧客名称,商品名,単価,数量,計
2020/5/7,サン企画 有限会社,商品B,3800,10,38000
2020/5/8,三和商事 株式会社,商品A,7200,7,50400
2020/5/11,株式会社 鈴木商店,商品C,1200,100,120000

◎ 複数のCSVファイルを1つにつなぎ合わせる

1つずつCSVファイルを読み込み、1行ずつリストのrowsに追加して、最後に書き込む
import csv
from pathlib import Path

# [売上月別]フォルダー内CSVファイルの読み込み
rows = []
skip_num = 0
for file in Path("売上月別").glob("*.csv"):
    f = open(file)
    reader = csv.reader(f)
    for row in reader:
        if reader.line_num <= skip_num:
            continue
        rows.append(row)
    f.close()
    skip_num = 3

# 書き込む
f = open("第1四半期売上.csv", mode="w", newline="")
writer = csv.writer(f)
for row in rows:
    writer.writerow(row)
f.close()

◎ CSVファイルをExcelブックに変換

フォルダーにある複数のCSVファイルを1つのExcelブックに変換。CSVファイル毎にシートを追加する

◯  file.stem

拡張子を除くファイル名を取得

◯  [row[0], row[1], row[5]]

左から対象行の1列目、2列目、6列目

◯  datetime.datetime.strptime

  (row[0], "%Y/%m/%d")

文字列の日付をdatatime型に変換

◯  int(row[5])

文字列を整数型に変換

import csv
import openpyxl
from pathlib import Path
import datetime

# 新規ブック作成
wb = openpyxl.Workbook()

# 「売上月別」フォルダー内CSVファイルの読み込み
herder_num = 3
for file in Path("売上月別").glob("*.csv"):
    # 新規シートを追加
    ws = wb.create_sheet(file.stem)
    # CSVファイルを開く
    f = open(file)
    reader = csv.reader(f)
    for row in reader:
        if reader.line_num <= herder_num:
            # ヘッダー行はそのまま追加
            ws.append([row[0], row[1], row[5]])
            continue

        # データ行は適宜データ型を変換
        dt = datetime.datetime.strptime(row[0], "%Y/%m/%d")
        customer = row[1]
        sales = int(row[5])
        # シートにデータ行を追加
        ws.append([dt, customer, sales])
        # 日付のセルは書式を指定する
        ws.cell(reader.line_num, 1).number_format = "yyyy/mm/dd"
    f.close()

# ブック作成時の既存シートを取り除く
ws_first = wb.worksheets[0]
wb.remove(ws_first)

# ブック保存
wb.save("第1四半期売上.xlsx")
実行結果

◎ ExcelブックをCSVファイルに変換

Excelブックの複数シートをシートごとにCSVファイルに保存する

◯  isinstance(cell.value, datetime.datetime):

 値のデータ型と指定したデータ型が一致するとTrueを返す

◯  cell.value.strftime("%Y/%m/%d")

datetime型のデータを書式を指定して文字列に変換

%Y/%m/%d  :自動的に0埋めされる

%Y/%#m/%#d:0埋めされない

import csv
import openpyxl
from pathlib import Path
import datetime

# 元のブックを開く
wb = openpyxl.load_workbook("売上データ.xlsx", data_only=True)

# csvファイル保存先のフォルダー
Path("売上データ").mkdir(exist_ok=True)

# シートを1つずつCSVファイルに変換
for sheet in wb.worksheets:
    # csvファイルのパスを作成
    file = "売上データ/" + sheet.title + ".csv"
    # 書き込みモードでCSVファイルを開く
    f = open(file, mode="w", newline="")
    writer = csv.writer(f)
    # シートのデータをCSVファイルに書き込む
    for row in sheet:
        # 1行分のデータを入れるリスト
        values = []
        for cell in row:
            if isinstance(cell.value, datetime.datetime):
                # 日付のデータは書式を指定して文字列にする
                values.append(cell.value.strftime("%Y/%m/%d"))
            else:
                values.append(cell.value)
        writer.writerow(values)
    f.close()