Pythonで「四角に切れ」を解く>ファイルの入出力
#! /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のファイル入出力のよくあるコードなので、説明は省略します。
WindowsでPythonを使うとデフォルトのエンコーディングはcp932(WindowsのSJIS)になります。
Unicodeファイルを開くにはencoding指定がいります。
Pythonで UTF-8 BOM有りを読み込む場合はエンコードを'utf_8_sig' と指定します。
Windows'メモ帳'やExcelはUTF-8にBOMを付ける様です。
戻る |