В вашем примере файл не гарантированно будет закрыт до выхода из интерпретатора. В текущих версиях CPython файл будет закрыт в конце цикла for, потому что CPython использует подсчет ссылок в качестве основного механизма сборки мусора, но это деталь реализации, а не особенность языка. Другие реализации Python не гарантированно будут работать таким образом. Например, IronPython, PyPy и Jython не используют подсчет ссылок и поэтому не закрывают файл в конце цикла.
Неправильно полагаться на реализацию сборки мусора CPython, потому что она делает ваш код менее переносимым. У вас могут не возникнуть утечки ресурсов, если вы используете CPython, но если вы когда-нибудь переключитесь на реализацию Python, которая не использует подсчет ссылок, вам нужно будет просмотреть весь ваш код и убедиться, что все ваши файлы закрыты должным образом.
Для вашего примера используйте:
with open("filename") as f:
for line in f:
# ... do stuff ...