una txt sobreescribir partir manejo lista linea leer importar guardar especifica ejercicios crear como carpetas archivos archivo python multithreading

txt - leer una linea especifica de un archivo en python



¿Cómo creo un archivo en python sin sobrescribir un archivo existente? (3)

Actualmente tengo un bucle que intenta encontrar un nombre de archivo no utilizado agregando sufijos a una cadena de nombre de archivo. Una vez que no encuentra un archivo, utiliza el nombre que no pudo abrir un nuevo archivo con ese nombre. El problema es que este código se usa en un sitio web y podría haber varios intentos de hacer lo mismo al mismo tiempo, por lo que existe una condición de carrera.

¿Cómo puedo evitar que Python sobrescriba un archivo existente, si se crea uno entre el momento de la verificación y el tiempo de apertura en el otro hilo?

Puedo minimizar la posibilidad aleatorizando los sufijos, pero la probabilidad ya está minimizada en función de las partes de la ruta de acceso. Quiero eliminar esa oportunidad con una función que se puede decir, cree este archivo SOLAMENTE si no existe.

Puedo usar las funciones de win32 para hacer esto, pero quiero que esto funcione multiplataforma porque al final se alojará en Linux.


Si le preocupa una condición de carrera, puede crear un archivo temporal y luego cambiarle el nombre.

>>> import os >>> import tempfile >>> f = tempfile.NamedTemporaryFile(delete=False) >>> f.name ''c://users//hughdb~1//appdata//local//temp//tmpsmdl53'' >>> f.write("Hello world") >>> f.close() >>> os.rename(f.name, r''C:/foo.txt'') >>> if os.path.exists(r''C:/foo.txt'') : ... print ''File exists'' ... File exists

Alternativamente, puede crear los archivos usando un uuid en el nombre. en este artículo.

>>> import uuid >>> str(uuid.uuid1()) ''64362370-93ef-11de-bf06-0023ae0b04b8''


Si tiene una id asociada con cada subproceso / proceso que intenta crear el archivo, puede colocar esa identificación en el sufijo en algún lugar, garantizando así que no haya dos procesos que puedan usar el mismo nombre de archivo.

Esto elimina la condición de carrera entre los procesos.


Use os.open() con os.O_CREAT y os.O_EXCL para crear el archivo. Eso fallará si el archivo ya existe:

>>> fd = os.open("x", os.O_WRONLY | os.O_CREAT | os.O_EXCL) Traceback (most recent call last): File "<stdin>", line 1, in <module> OSError: [Errno 17] File exists: ''x''

Una vez que haya creado un nuevo archivo, use os.fdopen() para convertir el identificador en un objeto de archivo de Python estándar:

>>> fd = os.open("y", os.O_WRONLY | os.O_CREAT | os.O_EXCL) >>> f = os.fdopen(fd, "w") # f is now a standard Python file object

Edición: Desde Python 3.3, el open() incorporado tiene un modo x que significa "abrir para creación exclusiva, fallando si el archivo ya existe".