Best use of "open" context manager

Liste des GroupesRevenir à cl python 
Sujet : Best use of "open" context manager
De : rob.cliffe (at) *nospam* btinternet.com (Rob Cliffe)
Groupes : comp.lang.python
Date : 06. Jul 2024, 12:49:06
Autres entêtes
Message-ID : <mailman.3.1720263159.2981.python-list@python.org>
References : 1
User-Agent : Mozilla Thunderbird
Consider this scenario (which I ran into in real life):
     I want to open a text file and do a lot of processing on the lines of that file.
     If the file does not exist I want to take appropriate action, e.g. print an error message and abort the program.
I might write it like this:
try:
     with open(FileName) as f:
         for ln in f:
             print("I do a lot of processing here")
             # Many lines of code here .....
except FileNotFoundError:
     print(f"File {FileName} not found")
     sys.exit()
but this violates the principle that a "try" suite should be kept small, so that only targeted exceptions are trapped,
not to mention that having "try" and "except" far apart decreases readability.
Or I might write it like this:
try:
     f = open(FileName) as f:
     FileLines = f.readlines()
except FileNotFoundError:
     print(f"File {FileName} not found")
     sys.exit()
# I forgot to put "f.close()" here -:)
for ln in File Lines:
         print("I do a lot of processing here")
         # Many lines of code here .....
but this loses the benefits of using "open" as a context manager,
and would also be unacceptable if the file was too large to read into memory.
Really I would like to write something like
try:
     with open(FileName) as f:
except FileNotFoundError:
     print(f"File {FileName} not found")
     sys.exit()
else: # or "finally:"
         for ln in f:
             print("I do a lot of processing here")
             # Many lines of code here .....
but this of course does not work because by the time we get to "for ln in f:" the file has been closed so we get
ValueError: I/O operation on closed file
I could modify the last attempt to open the file twice, which would work, but seems like a kludge (subject to race condition, inefficient).
Is there a better / more Pythonic solution?
Best wishes
Rob Cliffe

Date Sujet#  Auteur
6 Jul 24 * Best use of "open" context manager3Rob Cliffe
6 Jul 24 `* Re: Best use of "open" context manager2Stefan Ram
7 Jul 24  `- Re: Best use of "open" context manager (Posting On Python-List Prohibited)1Lawrence D'Oliveiro

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal