62097


以下を実行しました。(あえてwithを使わないで書きました。)

[code]

    csv_file = open('svl1.csv', 'r', encoding="utf-8")
    csv_reader = csv.reader(csv_file)
    new_file = open('practice.csv', 'w', encoding="utf-8", newline='')
    csv_writer = csv.writer(new_file)
    csv_writer.writerow(['Word', 'symbol'])
    for line in csv_reader:
        csv_writer.writerow(line)
    new_file.close()
    csv_file.close()
    
[/code]

そしてその結果をprintしたら以下でした。

[code]

    ['Word', 'symbol']
    []
    ['also', 'ɔ́ːlsou']
    []
    ['air', 'ɛ́ər']
    []
    ['airplane', 'ɛ́ərplèin']
    []
    ['airport', 'ɛ́ərpɔ̀ːrt']
    []
    ['album', 'ǽlbəm']
    []
    ['all', 'ɔ́ːl']
    
[/code]

そこで調べていたら、newlineのparameterを設定しないといけないとわかりました。

[code]

    new_file = open('practice.csv', 'w', encoding="utf-8", newline='')
    
[/code]

問題自体は解決した。しかし、以下の動画ではファイルを実行しているのですが、この人のoutputは空のリストがありません。

[https://www.youtube.com/watch?v=q5uM4VKywbA&t=214s](https://www.youtube.com/watch?v=q5uM4VKywbA&t=214s)  
7:42～あたりです。

なぜ、newline=''としていないのに、この人は空白ができなかったのでしょうか？


CC BY-SA 4.0
2020-01-09T04:56:17.567
62091
2020-01-09T08:05:44.127
36091
question
python csv
csvの書くときのnewline＝""としなくても、段落が変わらないのはなぜか？


YouTubeの動画はMacOS(Unix系OS)だからでしょう。  
[Windows で Python の csv
モジュールで改行コードを正しく出力する](https://blog.sgry.jp/entry/2019/07/26/001341)

> Python 標準の csv パッケージ は CSV ファイルを手軽に入出力できるので重宝しているのだけれど、Windows
> で使うと改行コードがおかしくなることがあった。見た目的には「各行が 2
> 回改行されてしまう」ような状態。これを回避する簡単な方法がやっと分かったので、今日はその備忘録。
>
> 普通に CSV 書き出しを実装すると、テキストモードで開いたファイルオブジェクトを渡して csv.writer または csv.DictWriter
> を作り、その writerow() などのメソッドを呼ぶことになると思う。こうすると、残念なことに「CR+LF (\r\n) で出力されるべきところ
> CR+CR+LF (\r\n\n) が出力され」てしまう。多くの Windows プログラマはピンと来るだろうけれど、どうやら csv モジュールは
> OS を区別せず常に改行コードとして CR+LF (\r\n) を書き込んでしまっているのだと推測される。

Pythonのドキュメントの脚注にも記述されています。  
[脚注 csv --- CSV ファイルの読み書き](https://docs.python.org/ja/3/library/csv.html#id3)

> 脚注  
>  1(1,2) newline='' が指定されない場合、クォートされたフィールド内の改行は適切に解釈されず、書き込み時に \r\n
> を行末に用いる処理系では余分な \r が追加されてしまいます。csv モジュールは独自
> ([universal](https://docs.python.org/ja/3/glossary.html#term-universal-
> newlines)) の改行処理を行うため、newline='' を指定することは常に安全です。

上記の「書き込み時に \r\n を行末に用いる処理系」というのがWindows系OSのことを指しています。

[universal newlines 用語集 Python
3.8.1](https://docs.python.org/ja/3/glossary.html#term-universal-newlines)

> テキストストリームの解釈法の一つで、以下のすべてを行末と認識します: Unix の行末規定 '\n'、Windows の規定 '\r\n'、古い
> Macintosh の規定 '\r'。利用法について詳しくは、 PEP 278 と PEP 3116 、さらに
> [bytes.splitlines()](https://docs.python.org/ja/3/library/stdtypes.html#bytes.splitlines)
> も参照してください。


CC BY-SA 4.0
2020-01-09T07:57:19.050
62097
2020-01-09T08:05:44.127
2020-06-17T08:14:45.997
-1
26370
62091
answer