日: 2019年3月31日

Linux環境で作成したPythonプログラムが、Windows環境ではout of range

マルチプラットホーム対応で、Webアプリへの転用もできるので、主にPythonでプログラムの作成をしていますが、仕事PCのメインOSをLinuxに移行した関係でプログラム作成、確認も必然的にLinux環境が主となってしまいます。

しかし、お客様の環境は、殆どがWindows7/10ですので、Windows環境で動作することが必要となります。

ところが、残念ながら、pythonで作成したプログラムが、Linux上では問題ないのにWindows上ではエラーを吐いたり、画面表示やライブラリーの動作が異なることが多々あります。

その1つが、「Out of Range」

ファイルの読み書きをする場合に起きやすいエラーですが、CSVファイルの扱いに関しては、以下の盛り込むことで、ファイルの読み書きに関しては対策できます。

書き込み時、
withopen(data_file, 'w', newline='', encoding='utf-8') as fo:
    writer = csv.writer(fo)
    writer.writerows( myFile )
 
読み出し時、
withopen(data_file, 'r', newline='', encoding='utf-8') as fi:
    reader = csv.reader(fi)
    myFile = [row for row in reader]

out of Rangeの要因は、改行の扱いで、「newline=”」を指定することで余分な改行が回避されて正常に読み書きできるようになります。

また、プラットフォームの違いによりエンコードでエラーとなることも多々ありますので、明示的に「encoding=’utf-8’」コード指定しておきます。

その他、ファイルがないのにファイルOpen すると当然エラーなりますので、以下でファイルの有無の判定をします。
if os.path.exists(data_file):
   with open(data_file, 'r', newline='', encoding='utf-8') as fi:
            reader = csv.reader(fi)
            myFile = [row for row in reader]

ファイルがない場合に新規にファイルを作りたい場合は、

if not os.path.exists(data_file):
     with open(data_file, 'w', newline='', encoding='utf-8') as fo:
          writer = csv.writer(fo)
          writer.writerows(myFile)

補足:

data_fileは、パスを含めたファイル名を指定します。

myFileは、読み書きするデータとなります。csv」の場合リストとなります。