521 文字
3 分
Pythonのopenで改行コードが変わった話 in Windows
Pythonでちょっとしたスクリプトを書いていたのですが、どうにも入力ファイルと出力ファイルの改行コードが変わってしまってちょっとはまったので、対応メモです。
環境はWindows 10 + Python3.5になります。
そもそも改行コードの確認方法がわからない人は、こちらを参考にしてください。
https://mem-archive.com/2018/12/23/post-1308/
現象
このようにファイルを1行ずつ読み込んで出力するだけのプログラムを作ります。
with open("./input.txt") as f: for line in f: print(line, end='')input.txtの改行コードは\r\nです。
$ od -c input.txt0000000 h o g e \r \n f u g a \r \n p i y o0000020実行して結果をファイルに出力します。
$ python3 main.py > output.txtoutput.txtの改行コードは\nになってしまいます。ついでにファイルの最後にも改行コードが付与されています。
$ od -c output.txt0000000 h o g e \n f u g a \n p i y o \n0000017解決策
先ほどのプログラムをこのように修正します。openにnewline引数を追加してやりました。
with open("./input.txt", newline='') as f: for line in f: print(line, end='')このプログラムで出力されたファイルの改行コードは、変換されずにそのままになります。
$ od -c output.txt0000000 h o g e \r \n f u g a \r \n p i y o0000020newlineを指定しない場合、デフォルトではNoneになります。このときの動作は、\r、\n、\r\nを改行コードとしてみなして、勝手に全部\nとして扱います。
newline=''とすると、改行コードを変換せずそのまま扱います。
試してはいませんが、newlineに\r\nとかを指定すれば、\r\nだけを改行コードとして扱えたりもするらしいです。
勝手に改行コード変えられると思わぬところで躓くことがあると思うのですが、なぜデフォルトで変換するような挙動になってるんでしょうね。
参考: