bartc wrote: > On 24/05/2017 16:41, Peter Otten wrote: >> Dennis Lee Bieber wrote: >> >>> On Tue, 23 May 2017 21:42:45 +0100, bartc <b...@freeuk.com> declaimed the >>> following: >>> >>>> Is it necessary to sort them? If XXX is known, then presumably the >>>> first file will be called XXX_chunk_0, the next XXX_chunk_1 and so on. >>>> >>> >>> XXX_chunk_1 >>> XXX_chunk_10 >>> XXX_chunk_2 >> >> This is a problem you run into if you do sort the filenames (the wrong >> way, alphabetically). If I understand Bart correctly he suggests >> something like >> >> with open(DESTFILE, "wb") as outstream: >> for filename in map("XXX_chunk_{}".format, itertools.count()): >> try: >> with open(filename, "rb") as instream: >> shutil.copyfileobj(instream, outstream) >> except FileNotFoundError: >> break >> > > Yes, that sort of thing, provided the first file end with _0, XXX is > known, and the endings are consecutive and well-formed. I was going to > post some code but wasn't sure how 'with' dealt with file errors: > > i = 0 > > while 1: > file = "XXX_chunk_"+str(i) > print (file) > with open(file) as inf: > .... > i += 1 Inside the with suite the author of the context manager gets to decide. E. g. you may decide to swallow everyhing:
>>> from contextlib import contextmanager >>> >>> @contextmanager ... def catch(): ... try: yield ... except: pass ... >>> with catch(): 1/0 ... >>> For whatever open() returns the reaction is to close the file and propagate the error: >>> with open("/dev/null", "rb") as f: 1/0 ... Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> f.closed True However, in the case of a failing open() the file's __enter__ method is not yet called and so the behaviour is the same as for the conventional inf = open(file) -- https://mail.python.org/mailman/listinfo/python-list