【Python】CSVファイルを操作してみよう!

Python

CSV(Comma Separated Values)ファイル:カンマでデータを区切った「テキストファイル」

読み込み

ヘッダ行以外を読み込むコードです。

import csv

f = open("/Users/TY/Downloads/data/売上データ.csv",  encoding="cp932")
#f = open("/Users/TY/Downloads/data/売上データ.csv",  encoding="shift-jis")

reader = csv.reader(f)

# ヘッダ行数
header_num = 1

for row in reader:
    #行番号がヘッダ行数以下であれば処理をスキップ
    if reader.line_num <= header_num:
        continue
    print(row)
f.close()

>>>
['A社', '2022/1/1', 'お菓子', '100', '300', '30000']
['B社', '2022/1/2', '文具', '500', '4', '2000']
['A社', '2022/1/3', '文具', '800', '7', '5600']
['C社', '2022/1/4', 'お菓子', '300', '5', '1500']
['B社', '2022/1/5', '寝具', '20000', '1', '20000']
['C社', '2022/1/6', '寝具', '3000', '6', '18000']

「UnicodeDecodeError」になる場合は、文字コードを変更します。コンピュータ上では、文字を表示するために、1つ1つの文字に固有の識別番号(文字コード)を割り当てて管理します。文字に対して何らかの操作をする際に、コンピュータが扱いやすいように、「符号化」(Encode)し、人が扱いやすいように「復号化」(Decode)しています。PythonでCSVファイルを読み込む時は、OS標準の文字コードを用いるため、「復号化」(Decode)出来ないと「UnicodeDecodeError」になります。
このエラーを回避するためには、「ファイル書き込みに使用されている文字コードを指定」する必要があります。
文字コードは以下のどちらかでほとんど対処可能です。
cp932:日本語版Windows標準の文字コード(shift-JISの拡張)
UTF-8

書き込み

import csv

data_list = [
['会社名', '売上日', '商品名', '単価', '数量', '小計'],
['A社', '2022/1/1', 'お菓子', '100', '300', '30000'],
['B社', '2022/1/2', '文具', '500', '4', '2000'],
['A社', '2022/1/3', '文具', '800', '7', '5600'],
['C社', '2022/1/4', 'お菓子', '300', '5', '1500'],
['B社', '2022/1/5', '寝具', '20000', '1', '20000'],
['C社', '2022/1/6', '寝具', '3000', '6', '18000'],
]

f = open("/Users/TY/Downloads/data/更新_売上データ.csv", mode="w", newline="", encoding="cp932")
writer = csv.writer(f)
for data in data_list:
    writer.writerow(data)
f.close()

データの追記

import csv

add_list = [
['D社', '2022/1/7', '雑貨', '150', '10', '1500'],
['E社', '2022/1/8', '惣菜', '300', '30', '9000'],
]

#追記は、mode="a"で末尾から行を追加
f = open("/Users/TY/Downloads/data/更新_売上データ.csv", mode="a", newline="", encoding="cp932")
writer = csv.writer(f)

for data in add_list:
    writer.writerow(data)
f.close()

ファイルの連結

import csv
from pathlib import Path

# 「売上月別」フォルダー内CSVファイルの読み込み
rows = []

#最初のループはヘッダーも読み込む
skip_num = 0
for file in Path("/Users/TY/Downloads/data/NewFolder").glob("*.csv"):
    f = open(file, encoding="cp932")
    reader = csv.reader(f)
    for row in reader:
        #行番号がヘッダ行数以下であれば処理をスキップ
        if reader.line_num <= skip_num:
            continue
        rows.append(row)
    f.close()
    
    # ヘッダ行数
    skip_num = 1

# 書き込み
f = open("/Users/TY/Downloads/data/更新_売上データ.csv", mode="w", newline="", encoding="cp932")
writer = csv.writer(f)
for row in rows:
    writer.writerow(row)
f.close()

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

フォルダ内の複数のCSVファイルを集約し、一つのExcelブックにシートを分けて追加します。

import csv
import openpyxl
from pathlib import Path
import datetime

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

# 集約したいフォルダ内のCSVファイルを順に読み込み
header_num = 1
for file in Path("/Users/TY/Downloads/data/NewFolder").glob("*.csv"):
    # 新規シート追加
    ws = wb.create_sheet(file.stem)
    # CSVファイルを開く
    f = open(file, encoding="cp932")
    reader = csv.reader(f)
    # CSVファイルを1行ずつ読み込む
    for row in reader:
        if reader.line_num <= header_num:
            # ヘッダー行はそのまま追加
            ws.append([row[0], row[1], row[2], row[3], row[4], row[5]])
            continue

        # データ行はデータ型を変換
        store = row[0]
        dt = datetime.datetime.strptime(row[1], "%Y/%m/%d")
        product = str(row[2])
        cost = int(row[3])
        quantity = int(row[4])
        total = int(row[5])
        # シートにデータ行を追加
        ws.append([store, dt, product, cost, quantity, total])
        # 日付セルは書式を指定
        ws.cell(reader.line_num, 2).number_format = "yyyy/m/d"
    f.close()

# 作成時の既存シートを削除
ws_first = wb.worksheets[0]
wb.remove(ws_first)

# ブック保存
wb.save("/Users/TY/Downloads/data/更新_売上データ.xlsx")

注意点!
日付のセルから.valueで値を取得すると、「datetime型」になるため、CSVファイルにそのまま書き込みをすると、「2022−01−01 00:00:00」のようになります。そのため、任意の書式に変換して書き込みを実施します。

import datetime

dt = datetime型のデータ

ds = dt.strftime("%Y-%m-%d")
>>> 2022-01-01

ds = dt.strftime("%Y/%m/%d")
>>> 2022/01/01

ds = dt.strftime("%Y/%#m/%#d")
>>> 2022/1/1

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

import csv
import openpyxl
from pathlib import Path
import datetime

# 元のブックを開く
wb = openpyxl.load_workbook("/Users/TY/Downloads/data/更新_売上データ.xlsx", data_only=True)

# CSVファイル保存先のフォルダ指定
Path("/Users/TY/Downloads/data/New").mkdir(exist_ok=True)

# シートを1つずつCSVファイルに変換
for sheet in wb.worksheets:
    # CSVファイルのパスを作成
    file = "/Users/TY/Downloads/data/New/" + sheet.title + ".csv"
    # 書き込みモードでCSVファイルを開く
    f = open(file, mode="w", newline="", encoding="cp932")
    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()

CSVファイルの文字コードを確認する方法

メモ帳で開いて、[ファイル] > [開く]で確認したいCSVファイルを選択します。ウインドウの下の「文字コード」に現在の文字コードが表示されます。

タイトルとURLをコピーしました