@@ -312,7 +312,7 @@ def _tmp_file_name(
312
312
path : epath .PathLike ,
313
313
subfolder : str | None = None ,
314
314
) -> epath .Path :
315
- """Returns the temporary file name for the given path.
315
+ """Returns the temporary file path dependent on the given path and subfolder .
316
316
317
317
Args:
318
318
path: The path to the file.
@@ -322,9 +322,12 @@ def _tmp_file_name(
322
322
path = epath .Path (path )
323
323
file_name = f'{ _tmp_file_prefix ()} .{ path .name } '
324
324
if subfolder :
325
- return path .parent / subfolder / file_name
325
+ tmp_path = path .parent / subfolder / file_name
326
326
else :
327
- return path .parent / file_name
327
+ tmp_path = path .parent / file_name
328
+ # Create the parent directory if it doesn't exist.
329
+ tmp_path .parent .mkdir (parents = True , exist_ok = True )
330
+ return tmp_path
328
331
329
332
330
333
@contextlib .contextmanager
@@ -334,32 +337,38 @@ def incomplete_file(
334
337
) -> Iterator [epath .Path ]:
335
338
"""Writes to path atomically, by writing to temp file and renaming it."""
336
339
tmp_path = _tmp_file_name (path , subfolder = subfolder )
337
- tmp_path .parent .mkdir (exist_ok = True )
338
340
try :
339
341
yield tmp_path
340
342
tmp_path .replace (path )
341
343
finally :
342
344
# Eventually delete the tmp_path if exception was raised
343
- tmp_path .unlink (missing_ok = True )
345
+ if subfolder :
346
+ tmp_path .parent .unlink (missing_ok = True )
347
+ else :
348
+ tmp_path .unlink (missing_ok = True )
344
349
345
350
346
351
@contextlib .contextmanager
347
352
def incomplete_files (
348
353
path : epath .Path ,
354
+ subfolder : str | None = None ,
349
355
) -> Iterator [epath .Path ]:
350
356
"""Writes to path atomically, by writing to temp file and renaming it."""
351
- tmp_file_prefix = _tmp_file_prefix ( )
352
- tmp_path = path . parent / f' { tmp_file_prefix } .{ path .name } '
357
+ tmp_path = _tmp_file_name ( path , subfolder = subfolder )
358
+ tmp_file_prefix = tmp_path . name . removesuffix ( f' .{ path .name } ')
353
359
try :
354
360
yield tmp_path
355
361
# Rename all tmp files to their final name.
356
- for tmp_file in path .parent .glob (f'{ tmp_file_prefix } .*' ):
362
+ for tmp_file in tmp_path .parent .glob (f'{ tmp_file_prefix } .*' ):
357
363
file_name = tmp_file .name .removeprefix (tmp_file_prefix + '.' )
358
364
tmp_file .replace (path .parent / file_name )
359
365
finally :
360
366
# Eventually delete the tmp_path if exception was raised
361
- for tmp_file in path .parent .glob (f'{ tmp_file_prefix } .*' ):
362
- tmp_file .unlink (missing_ok = True )
367
+ if subfolder :
368
+ tmp_path .parent .unlink (missing_ok = True )
369
+ else :
370
+ for tmp_file in tmp_path .parent .glob (f'{ tmp_file_prefix } .*' ):
371
+ tmp_file .unlink (missing_ok = True )
363
372
364
373
365
374
def is_incomplete_file (path : epath .Path ) -> bool :
0 commit comments