57510


後述のsample.csvをPythonで読み込むと、with文を使うと特に問題なく、一行ずつ読み込まれます。  
しかし、with文を使わずにopen(), f.read()でループをとすると、  
一行ずつではなくて1文字ずつ読み込まれてしまいます。  
一行ずつ読み込まれるのが期待する挙動です。

withをつかった場合と使わない場合の挙動の違いはどこから来ているのでしょうか？  
また、with文を使わずに一行ずつ読み込むことはできるのでしょうか？(実用的でないかもですが)

[code]

    $ cat sample.csv 
    id,name
    1,Apple
    2,Banana
    3,Cat
    
[/code]

[code]

    # with文を使った場合
    with open(filepath) as f:
        print(f.read())
    
    # 出力
    """
    id,name
    1,Apple
    2,Banana
    3,Cat
    """
    
[/code]

[code]

    # with文を使わない場合
    f = open(filepath)
    for row in f.read():
        print(row)
    f.close()
    
    # 出力
    """
    i
    d
    ,
    n
    a
    m
    e
    
    
    1
    ,
    A
    p
    p
    l
    e
    (省略)
    """
    
[/code]


CC BY-SA 4.0
2019-08-21T05:35:38.127
57508
2019-09-16T14:18:50.793
2019-08-21T06:21:21.693
29826
32428
question
python python3
Pythonでファイルを読み込む時にwith文を使わない時の挙動の疑問


# 質問について

2つ目の `with` を使わないサンプルコードにおいて、for文を使っているのが原因です。

1つ目のサンプルコードと等価なコードは以下のようになります。

[code]

    f = open(filepath)
    print(f.read())
    f.close()
    
[/code]

# 解決方法について

それぞれで使われている `read` はファイル全体を読み込むメソッドです。

> 一行ずつ読み込まれるのが期待する挙動です。

この目的の場合、[readline](https://docs.python.org/ja/3/library/io.html#io.IOBase.readline)
や
[readlines](https://docs.python.org/ja/3/library/io.html#io.IOBase.readlines)
を使うとよろしいでしょう。

例：

[code]

    with open(filepath) as f:
        lines = f.readlines()
    print(lines[0]) # => id,name
    
[/code]

[7\. 入力と出力 — Python 3.7.4
ドキュメント](https://docs.python.org/ja/3/tutorial/inputoutput.html)


CC BY-SA 4.0
2019-08-21T05:49:44.173
57510
2019-08-21T05:58:13.787
2019-08-21T05:58:13.787
29826
29826
57508
answer


readlinesは一度にリストに読み込まれるため、通常はforループで回すようにしてください。

[code]

    with open(path) as f:
        for line in f:
            print(line)
    
[/code]

また、with文についてあまりご存知でなければ、コンテキストマネージャを調べることをおすすめします。


CC BY-SA 4.0
2019-09-16T14:18:50.793
59097
2019-09-16T14:18:50.793
57508
answer