Skip to content

open() file objects are not iterable #490

@ggozad

Description

@ggozad

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())"))

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions