PythonでCSVをwith読み書きする例

会社でPython使ってもいいよって言われたので、CSVデータ加工用の覚書きとして。

# 入力例
```csv:infile.csv
number,name,birthymd,sex,yubin,adr1,adr2,sinsei_ymd,nintei_ymd,happu_ymd,type,pet,test_nowymd
0000111111,安藤　太一郎,19860602,1,1231111,AAA県BBB市CCC-123,サンプルヴィラA 001号室,20190501,20190507,20190507,1,0,20200229
0000222222,伊藤　炭二郎,19920505,1,1232222,AAA県BBB市CCC-123,サンプルヴィラB 002号室,20190501,20190514,20190514,2,1,20200228
0000333333,鵜飼　多三枝,19990909,2,1233333,AAA県BBB市CCC-123,サンプルヴィラC 003号室,20190501,20190514,20190514,1,2,20200131
0000444444,江崎　幸四郎,19870831,1,1234444,AAA県BBB市CCC-123,サンプルヴィラD 004号室,20190501,20190507,20190507,2,0,20191231
0000555555,岡本　小五郎,19520205,1,1235555,AAA県BBB市CCC-123,サンプルヴィラE 005号室,20190601,20190615,20190615,1,2,20191130
0000666666,柿崎　喜六郎,19811030,1,1236666,AAA県BBB市CCC-123,サンプルヴィラF 006号室,20190601,20190608,20190608,1,2,20191129
0000777777,城島　香七子,19721103,2,1237777,AAA県BBB市CCC-123,サンプルヴィラG 007号室,20190601,20190608,20190608,2,1,20191030
0000888888,釘宮　亜八芽,19330303,2,1238888,AAA県BBB市CCC-123,サンプルヴィラH 008号室,20190501,20190507,20190507,1,1,20190401
0000999999,敬堂　勘九郎,19680229,1,1239999,AAA県BBB市CCC-123,サンプルヴィラI 009号室,20190601,20190615,20190615,2,0,20190331
1111000000,小柳　猿十郎,19200222,1,1240000,AAA県BBB市CCC-123,サンプルヴィラJ 010号室,20190501,20190507,20190507,2,1,20190228
1111111111,佐渡　十一郎,19430130,1,1241111,AAA県BBB市CCC-123,サンプルヴィラK 011号室,20190601,20190608,20190608,1,0,20190227
1111222222,宍戸　十二郎,19530301,1,1242222,AAA県BBB市CCC-123,サンプルヴィラL 012号室,20190501,20190507,20190507,2,1,20190131
```

# 読み書き用のコード
```python:csv_in_out.py
# 変数の初期化
## カウンタ用の変数
[line_count, person_count] = [0, 0]
## 入力値に関する変数
[number, name, birthymd, sex, post, adr1, adr2, ymd_sinsei, ymd_nintei, ymd_happu, types, pet, ymd_test] = ['', '', '', '', '', '', '', '', '', '', '', '', '']
## 出力値に関する変数１
[birth_year, birth_month, birth_day, infile, outfile, line, item_str, data_str] = [0, 0, 0, '', '', '', '', '']
## 出力値に関する変数２（空の配列）
item = set()
data = set()

# ファイルの改行コードを指定する場合、open時。
## \n(LF)：Unix系OS全般、Mac OS X , \r\n(CR+LF)：Windows系OS , \r(CR)：古いMac OS（9以前）
with open('infile.csv', 'r', encoding='utf-8', newline='\n') as infile, \
    open('outfile.csv', 'w', encoding='utf-8', newline='\n') as outfile:

    # 1行ずつinfileの内容を読込んで処理する
    for line in infile:
        # 読込んだ行の項目を先頭から順に、カンマ区切りで対応する変数へ文字列としてmap。
        number, name, birthymd, sex, post, adr1, adr2, ymd_sinsei, ymd_nintei, ymd_happu, types, pet, ymd_test \
        = map(str, line.split(','))
        # 読込CSVのラインカウントを＋１
        line_count += 1

        # 読込CSVのラインカウント１行目は項目名。２行目からが実データ。
        # 確認用のコンソール出力例１　：　○人目処理
        if line_count >= 2:
            person_count +=  1
            # コンソール出力
            print(u'{}人目の処理を行っています....'.format(person_count))

        # 確認用のコンソール出力例２　：誕生年月日をゼロサプレスして表示
        if line_count >= 2:
            birth_year  = int(birthymd[0:4])
            birth_month = int(birthymd[4:6])
            birth_day   = int(birthymd[6:8])
            print(u'生年月日は{}/{}/{}です。'.format(birth_year,birth_month,birth_day))

        # 確認用のコンソール出力例３　：番号・名前・生年月日をセットで表示
        if line_count >= 2:
            # コンソール出力（編集文字列）
            print(u'番号 {} の {} は {}/{}/{} 生まれ。'.format(number,name,birth_year,birth_month,birth_day))

        # 出力用のメイン処理部分。
        ## 出力したい項目名と実データを配列指定後、カンマ区切り文字列へ変えてoutfileへprint。
        if line_count == 1:
            # ファイル出力（カンマ区切り文字列：項目名）
            item = ["番号", "氏名", "生年月日", "性別", "郵便番号", "住所１", "住所２", "申請日", "認定日", "発布日", "種別", "ペット", "テスト日付"]
            item_str = ",".join(map(str, item))
            print(item_str, file=outfile)
        if line_count >= 2:
            # ファイル出力（カンマ区切り文字列：実データ）
            # < !データに何らかの加工を施したり、カウントをするなら、ここへロジックを記述! >
            data = [number, name, birthymd, sex, post, adr1, adr2, ymd_sinsei, ymd_nintei, ymd_happu, types, pet, ymd_test]
            data_str = ",".join(map(str, data))
            print(data_str, file=outfile, end='')

        # 確認用のコンソール出力例４　：出力データを表示
        if line_count >= 2:
            print(u'file output >> {}'.format(data_str),end='')

    # 確認用のコンソール出力例５　：処理件数合計の表示
    print(u'') # 改行
    print(u'合計 {} 件を処理しました。'.format(person_count))
```
# 出力結果
```csv:outfile.csv
番号,氏名,生年月日,性別,郵便番号,住所１,住所２,申請日,認定日,発布日,種別,ペット,テスト日付
0000111111,安藤　太一郎,19860602,1,1231111,AAA県BBB市CCC-123,サンプルヴィラA 001号室,20190501,20190507,20190507,1,0,20200229
0000222222,伊藤　炭二郎,19920505,1,1232222,AAA県BBB市CCC-123,サンプルヴィラB 002号室,20190501,20190514,20190514,2,1,20200228
0000333333,鵜飼　多三枝,19990909,2,1233333,AAA県BBB市CCC-123,サンプルヴィラC 003号室,20190501,20190514,20190514,1,2,20200131
0000444444,江崎　幸四郎,19870831,1,1234444,AAA県BBB市CCC-123,サンプルヴィラD 004号室,20190501,20190507,20190507,2,0,20191231
0000555555,岡本　小五郎,19520205,1,1235555,AAA県BBB市CCC-123,サンプルヴィラE 005号室,20190601,20190615,20190615,1,2,20191130
0000666666,柿崎　喜六郎,19811030,1,1236666,AAA県BBB市CCC-123,サンプルヴィラF 006号室,20190601,20190608,20190608,1,2,20191129
0000777777,城島　香七子,19721103,2,1237777,AAA県BBB市CCC-123,サンプルヴィラG 007号室,20190601,20190608,20190608,2,1,20191030
0000888888,釘宮　亜八芽,19330303,2,1238888,AAA県BBB市CCC-123,サンプルヴィラH 008号室,20190501,20190507,20190507,1,1,20190401
0000999999,敬堂　勘九郎,19680229,1,1239999,AAA県BBB市CCC-123,サンプルヴィラI 009号室,20190601,20190615,20190615,2,0,20190331
1111000000,小柳　猿十郎,19200222,1,1240000,AAA県BBB市CCC-123,サンプルヴィラJ 010号室,20190501,20190507,20190507,2,1,20190228
1111111111,佐渡　十一郎,19430130,1,1241111,AAA県BBB市CCC-123,サンプルヴィラK 011号室,20190601,20190608,20190608,1,0,20190227
1111222222,宍戸　十二郎,19530301,1,1242222,AAA県BBB市CCC-123,サンプルヴィラL 012号室,20190501,20190507,20190507,2,1,20190131
```

```csv:確認用出力
1人目の処理を行っています....
生年月日は1986/6/2です。
番号 0000111111 の 安藤　太一郎 は 1986/6/2 生まれ。
file output >> 0000111111,安藤　太一郎,19860602,1,1231111,AAA県BBB市CCC-123,サンプルヴィラA 001号室,20190501,20190507,20190507,1,0,20200229
2人目の処理を行っています....
生年月日は1992/5/5です。
番号 0000222222 の 伊藤　炭二郎 は 1992/5/5 生まれ。
file output >> 0000222222,伊藤　炭二郎,19920505,1,1232222,AAA県BBB市CCC-123,サンプルヴィラB 002号室,20190501,20190514,20190514,2,1,20200228
3人目の処理を行っています....
生年月日は1999/9/9です。
番号 0000333333 の 鵜飼　多三枝 は 1999/9/9 生まれ。
file output >> 0000333333,鵜飼　多三枝,19990909,2,1233333,AAA県BBB市CCC-123,サンプルヴィラC 003号室,20190501,20190514,20190514,1,2,20200131
4人目の処理を行っています....
生年月日は1987/8/31です。
番号 0000444444 の 江崎　幸四郎 は 1987/8/31 生まれ。
file output >> 0000444444,江崎　幸四郎,19870831,1,1234444,AAA県BBB市CCC-123,サンプルヴィラD 004号室,20190501,20190507,20190507,2,0,20191231
5人目の処理を行っています....
生年月日は1952/2/5です。
番号 0000555555 の 岡本　小五郎 は 1952/2/5 生まれ。
file output >> 0000555555,岡本　小五郎,19520205,1,1235555,AAA県BBB市CCC-123,サンプルヴィラE 005号室,20190601,20190615,20190615,1,2,20191130
6人目の処理を行っています....
生年月日は1981/10/30です。
番号 0000666666 の 柿崎　喜六郎 は 1981/10/30 生まれ。
file output >> 0000666666,柿崎　喜六郎,19811030,1,1236666,AAA県BBB市CCC-123,サンプルヴィラF 006号室,20190601,20190608,20190608,1,2,20191129
7人目の処理を行っています....
生年月日は1972/11/3です。
番号 0000777777 の 城島　香七子 は 1972/11/3 生まれ。
file output >> 0000777777,城島　香七子,19721103,2,1237777,AAA県BBB市CCC-123,サンプルヴィラG 007号室,20190601,20190608,20190608,2,1,20191030
8人目の処理を行っています....
生年月日は1933/3/3です。
番号 0000888888 の 釘宮　亜八芽 は 1933/3/3 生まれ。
file output >> 0000888888,釘宮　亜八芽,19330303,2,1238888,AAA県BBB市CCC-123,サンプルヴィラH 008号室,20190501,20190507,20190507,1,1,20190401
9人目の処理を行っています....
生年月日は1968/2/29です。
番号 0000999999 の 敬堂　勘九郎 は 1968/2/29 生まれ。
file output >> 0000999999,敬堂　勘九郎,19680229,1,1239999,AAA県BBB市CCC-123,サンプルヴィラI 009号室,20190601,20190615,20190615,2,0,20190331
10人目の処理を行っています....
生年月日は1920/2/22です。
番号 1111000000 の 小柳　猿十郎 は 1920/2/22 生まれ。
file output >> 1111000000,小柳　猿十郎,19200222,1,1240000,AAA県BBB市CCC-123,サンプルヴィラJ 010号室,20190501,20190507,20190507,2,1,20190228
11人目の処理を行っています....
生年月日は1943/1/30です。
番号 1111111111 の 佐渡　十一郎 は 1943/1/30 生まれ。
file output >> 1111111111,佐渡　十一郎,19430130,1,1241111,AAA県BBB市CCC-123,サンプルヴィラK 011号室,20190601,20190608,20190608,1,0,20190227
12人目の処理を行っています....
生年月日は1953/3/1です。
番号 1111222222 の 宍戸　十二郎 は 1953/3/1 生まれ。
file output >> 1111222222,宍戸　十二郎,19530301,1,1242222,AAA県BBB市CCC-123,サンプルヴィラL 012号室,20190501,20190507,20190507,2,1,20190131
合計 12 件を処理しました。
```

# メモ
CSVデータが保有する項目値へ単純な加工を施したり、集計を行う際のテンプレとして使える？