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ファイルを選択します。ウインドウの下の「文字コード」に現在の文字コードが表示されます。