Eric Blake <ebl...@redhat.com> writes: > On 9/25/20 8:52 AM, Markus Armbruster wrote: > >>>> This was my best attempt to open the file read/write, creating it if it >>>> doesn't exist. >>>> >>>> Plain >>>> >>>> f = open(pathname, "r+", encoding='utf-8') >>>> >>>> fails instead of creates, and >>>> >>>> f = open(pathname, "w+", encoding='utf-8') >>>> >>>> truncates. >>>> >>>> If you know a better way, tell me! >>> >>> IIUC, you need "a+" as the mode, rather than "w+" >> Sure this lets me do >> f.seek(0) >> f.truncate(0) >> f.write(text) >> to overwrite the old contents on all systems? > > As long as you do a single pass over the output (you issue a stream of > f.write() after the truncate, but never a seek), then this will work.
Well, I do seek(), right before the truncate. >> Documentation cautions: >> [...] 'a' for appending (which on some Unix systems, means that >> all >> writes append to the end of the file regardless of the current seek >> position). > > Yes, that means that random access is impossible on such a stream. > But not all file creation patterns require random access. To be honest, I still prefer the code I wrote, because there the reader only wonders why I didn't just open(), while here we get to argue about subtleties of mode "a+".