CSVファイルにデータを書き込む
CSVファイルに書き込む
(ポイント)
・CSVファイルにデータを書き込むためにはopen()で開いて、CSV用ライターを作成する
・open()のカッコの中には、「書き込みモード」でファイルを開くためのmode="w"(wruteのw)と、二重に改行しないためのnewline=""を必ず指定する
・リーダーの時と同じように、ライターを使い終わったら、最後にf.close()でファイルを必ず閉じる
CSV用ライターの作成
f = open(CSVファイルのパス, mode="w", newline="") writer = csv.writer(f) f.close
CSVファイルにデータを書き込む処理
(ポイント)
・データを書き込むには、次のようにwriter.writerow()を呼び出す
・このカッコ内に1行分のデータをリストで渡すと、リストの各要素がCSV形式(カンマ区切り)で書き込まれる
・なお、writerow()は1行書き込むごとに改行してくれるが、open()も書き込みモードでは都度改行す流ため、改行が二重になってしまうため、先ほどnewline=""によりopen()の改行を無効にした
・変数data_listには「1行分のデータをセットしたリスト」を要素として持つリストを代入する。
CSVファイルにデータを書き込む処理
data_list = 書き込むデータ f = open(, mode="w", newline="") writer = csv.writer(f) for data in data_list: writer.writerow(data) f.close()
(ポイント)
・data_listは、リストの中にリストが含まれる構造になっている。内側のリストが、CSVファイルの1行分のデータに相当する
・Pythonでは、括弧の中で改行しても意味が変わらないため、1行ごと(各要素)の末尾に「,」を入れ忘れないように注意
・データ要素は"3800"のように文字列にしても良いが、3800のように数値をそのまま用いても大丈夫
・空白部分のデータには、空文字””を入力する
import csv data_list = [ ['売上データ', '', '', '', '', ''], ['', '', '', '', '', ''], ['売上日', '顧客名称', '商品名', '単価', '数量', '計'], ['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'] ] f = open("5月売上.csv", mode="w", newline="") writer = csv.writer(f) #data_listは「1行分のデータをセットしたリスト」を要素として持つリスト for data in data_list: writer.writerow(data) f.close()
CSVファイルにデータを追記する
・「mode="w"」を「mode="a"」(appendのa)に変更して「追記モード」でファイルを開く ⇨既存のファイルがない場合には、追加分のデータだけで新規ファイルが作成される
import csv data_list = [ ['2020/5/17', '三和商事 株式会社', '商品B', '3800', '10', '38000'], ['2020/5/23', '三和商事 株式会社', '商品C', '1200', '50', '60000'], ['2020/5/27', 'サン企画 有限会社', '商品A', '7200', '8', '57600'], ['2020/5/30', '三和商事 株式会社', '商品B', '3800', '12', '45600'] ] f = open("5月売上.csv", mode="a", newline="") writer = csv.writer(f) for data in data_list: writer.writerow(data) f.close()
複数のCSVファイルを1つに繋ぎ合わせる
(ポイント)
・例では「売上月別」というサブフォルダーにはいっているファイルは3つしかないが、フォルダーに入っているCSVファイルはいくつでも読み込めるようにする
・フォルダー内のファイル検索には、pathlibモジュールの「Path」を利用
・今回はCSVファイルが対象なの、blob()の括弧の中には検索パターンとして「*.csv」を指定して、CSVフォルを検索する
・一つずつCSVファイルを読み込み、1行ずつリストのrowsに追加していく。2つ目のファイルからはヘッダーは不要なので、rowsに追加しない。
・skip_numという変数を作成し、行番号(reader.line_num)がこの価以下の場合は追加しないようにする
⇨skip_numは最初のループでは「0」なので、1行もスキップされないが、次のループからは「3」に書き換えられるので、先頭の3行は読み飛ばされる
import csv from pathlib import Path #「売上月別」フォルダー内CSVファイルの読み込み rows = [] #最初のループはヘッダーも読み込む skip_num = 0 for file in Path("売上月別").glob("*.csv"): f = open(file,encoding="shift-jis", errors='ignore') 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()
★UnicodeDecodeErrorで躓くが、以下のサイトで解決✨
Python3でUnicodeDecodeErrorに躓く - Qiita
※なお、このプログラムはskip_numの初期値を「0」ではなく「2」にしておけば、ヘッダーのうち3行目の項目名だけを書き込むようになる