学習めも。

Python、Anaconda学習中🔰 ブログ引っ越ししました😄よろしくお願いします!https://noeiganolife.com/

記録用🔰

プログラミング以外の記事はこちら

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()

f:id:Moriane:20211211155653p:plain

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つに繋ぎ合わせる

f:id:Moriane:20211218140206p:plain (ポイント)
・例では「売上月別」というサブフォルダーにはいっているファイルは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行目の項目名だけを書き込むようになる f:id:Moriane:20211218150827p:plain