先日、個人的に使うツールをプログラミングしているときに改行コードを気にする場面があった。
文字列中の改行コード(改行文字列)を統一してくれる関数が欲しいが、1から自分で作ってバグったら時間がもったいない。
たぶんどこかにあるだろうとネットで探してみたが、今回使っているPythonで作られたコードはすぐに見つからない。
一方で、PHPのコードはすぐに見つかった。
PHPで改行コードを統一する関数: CRLF, CR, LF が混在してる文字列を LF に変換するなど
(リンク先:Qiita 2012.02.22の記事)
言語は違うが求めていたものと一致している。
短いし、これなら再現できるかな~、なんて思って真似して作ってみた。
結果、あっさり問題は解決。
元コードの作者様とインターネットに感謝!
需要があるかわからないが、今回作ったコードはここで公開しておく。
Python 3.5.1の環境で動作を確認した。
本体
# convert_eol.py
import re
def convert_eol(string, to="\n"):
return re.sub(r'\r\n|\r|\n', to, string)
ユニットテスト
# test_convert_eol.py
import unittest
from convert_eol import convert_eol
class TestConvertEol(unittest.TestCase):
def test_convert_eol_cr(self):
value = "CR + LF: \r\n CR: \r LF: \n"
expected = "CR + LF: \r CR: \r LF: \r"
actual = convert_eol(value, "\r")
self.assertEqual(expected, actual)
def test_convert_eol_lf(self):
value = "CR + LF: \r\n CR: \r LF: \n"
expected = "CR + LF: \n CR: \n LF: \n"
actual = convert_eol(value, "\n")
self.assertEqual(expected, actual)
def test_convert_eol_crlf(self):
value = "CR + LF: \r\n CR: \r LF: \n"
expected = "CR + LF: \r\n CR: \r\n LF: \r\n"
actual = convert_eol(value, "\r\n")
self.assertEqual(expected, actual)
if __name__ == "__main__":
unittest.main()