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

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

$ cat sample.csv 
id,name
1,Apple
2,Banana
3,Cat
# with文を使った場合
with open(filepath) as f:
    print(f.read())

# 出力
"""
id,name
1,Apple
2,Banana
3,Cat
"""
# 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
(省略)
"""