Memoize2

Python テキストストリームへ書き出す

とある EC プラットフォームで、CSV 上のデータ文字のバイト数オーバー規定が以下のようになっている。

  • アップロード時の Shift_JIS, newline="\r\n" でバイト数がカウントされる
  • データをクォートするクォート文字もバイト数にカウントされる
以上のことから、CSV へ変換前の元データをカウントしただけでは正確なバイト数が判明しない。 なので、一度文字列ストリームに CSV 形式で書き出し、Shift_JIS, newline="\r\n" に変換してバイト数を数える。

>>> import io
>>> import csv
# 対象データ内に改行を含めて csv モジュールにクォートさせる
>>> val = "aaa \n kkk \n hhh"
# この時点での Shift_JIS, newline="\r\n" でのバイト数は
>>> len(val.replace("\n", "\r\n").encode('shift_jis'))
17
# テキストストリームを用意する
# newline パラメータに None を指定すると環境にかかわらず "\n" で出力(CSV データ内の改行文字は別の話)
>>> output = io.StringIO(newline=None)
# csv の出力先にテキストストリームを指定
>>> cout = csv.writer(output)
# val を CSV の1データとして出力
>>> cout.writerow([ val ])
# テキストストリームの中身を確認してみる getvalue()
>>> output.getvalue()
'"aaa \n kkk \n hhh"\n'
# データ自体のバイト数を計測
>>> len(output.getvalue().rstrip().replace("\n", "\r\n").encode('shift_jis'))
19
# テキストストリームを close() で解放する
>>> output.close()

参考: Python3.5.2 16.2. io — ストリームを扱うコアツール class io.StringIO(initial_value='', newline='\n')

 

Last modified: 2016-12-19

Page Top

Index

Bw

Author: 中村 心 Shin Nakamura, Email: sn(at)i.basicwerk.com


© Shin Nakamura/BasicWerk 2008 - 2017