Summary
File objects returned by open() support .read(), .readline(), and .readlines(), but are not iterable. Any iteration form, for line in f, list(f), iter(f) or a comprehension raises TypeError: '_io.TextIOWrapper' object is not iterable
Minimal reproduction
- pydantic-monty 0.0.18
- macOS (arm64), CPython 3.13
from pydantic_monty import Monty, MemoryFile, OSAccess
vfs = OSAccess([MemoryFile("/data/lines.txt", "alpha\nbeta\ngamma\n")])
def run(code):
out = []
Monty(code).run(os=vfs, print_callback=lambda s, t: out.append(t))
return "".join(out).strip()
# These all work:
print(run("print(len(open('/data/lines.txt').read()))")) # 17
print(run("print(len(open('/data/lines.txt').readlines()))")) # 3
print(run("print(open('/data/lines.txt').readline().strip())")) # alpha
print(run("with open('/data/lines.txt') as f:\n print(f.read(5))")) # alpha
# This raises TypeError: '_io.TextIOWrapper' object is not iterable:
print(run("for line in open('/data/lines.txt'):\n print(line.strip())"))
Summary
File objects returned by
open()support.read(),.readline(), and.readlines(), but are not iterable. Any iteration form,for line in f,list(f),iter(f)or a comprehension raisesTypeError: '_io.TextIOWrapper' object is not iterableMinimal reproduction