Pythonで「四角に切れ」を解く>ファイルの入出力

ファイルの入出力


file.py のコード

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import csv, sys

# 1.ファイルの入出力

def toInt1D(strs): # 文字リストを数字リストにする
    r = []
    for s in strs:
        if s == "":
            r.append(0)
        elif s.isdigit():
            r.append(int(s))
        else:
            break
    return r

def toInt2D(csvf): # 文字リストのリストを数字リストのリストにする
    rs = []
    vl = len(toInt1D(csvf[0])) # 先頭リストの要素の個数
    for ss in csvf:
        vs = toInt1D(ss)
        if len(vs) == 0:
            break
        elif vl != len(vs):
            sys.exit(1) # 各行のカラム数が違う
        rs.append(vs)
    return rs

def readCsv(fileName):
    with open(fileName, encoding="utf_8_sig") as f:
        reader = csv.reader(f)
        csvf = [row for row in reader]
    return toInt2D(csvf)

def writeCsv(fileName, data):
    with open(fileName, 'w', encoding="utf_8", newline="") as f:
        writer = csv.writer(f)
        writer.writerows(data)

CSVファイルの読み書きをするコードです。

CやJavaはif文やループのブロック範囲を中括弧の{}で示しますが、Pythonは原則としてインデントで範囲を示します。
Pythonを作った人はこれが読みやすいと考えているのでしょうが、最初は戸惑いました。
さらに、ブロックがbreakなど1文しかない場合、コロンの後に書くこともできるようです。

toInt1DはCsvの文字列のリストを、数字のリストに変換しています。
数字以外は、盤面の枠と考えて変換を終えます。

toInt2Dは、toInt1Dの2次元版です。
各行の長さが異なるとエラーにしています。
数字以外ではじまる行は、盤面の枠と考えて変換を終えます。

残り2つの処理は、Pythonのファイル入出力のよくあるコードなので、説明は省略します。

encodingのメモ

WindowsでPythonを使うとデフォルトのエンコーディングはcp932(WindowsのSJIS)になります。
Unicodeファイルを開くにはencoding指定がいります。
Pythonで UTF-8 BOM有りを読み込む場合はエンコードを'utf_8_sig' と指定します。
Windows'メモ帳'やExcelはUTF-8にBOMを付ける様です。



トップ戻る
記述内容について一切保障しません。 リンクは自由に行ってかまいません。
Since 2019/07/07, Final update 2019/07/07, Presented by Ishida So