Tengo un script que voy a ejecutar varias veces , y la primera línea en la función principal de este guión es algo como esto:
def main():
users_csv_file_init()
Lo que esta función debe hacer es crear un archivo CSV y anexar los nombres de las columnas, si no existe tal archivo, y si lo hace, no debe hacer nada. Lo que escribí fue la siguiente:
def users_csv_file_init():
with open("users.csv", 'a+') as output_file:
writer = csv.writer(output_file)
writer.writerow(["userid", "username", "fname", "lname", "uuid"])
Esto no funciona, ya que crea una nueva fila (los nombres de las columnas) cada vez que ejecute la secuencia de comandos, y tiene sentido, ya que a+
crea el archivo si no existe y abrirlo en modalidad de apertura. Pero no puedo cambiar a w+
cualquiera, ya que elimina todo lo que estaba previamente en el archivo. Y a partir de los modos de open()
, única w+
y a+
parecen crear el archivo si no existe.
Pude comprobar manualmente si existe el archivo, así:
def users_csv_file_init():
if not os.path.exists("users.csv"):
with open("users.csv", 'w') as output_file:
writer = csv.writer(output_file)
writer.writerow(["userid", "username", "fname", "lname", "uuid"])
Pero me han dicho que es unpythonic y propenso a las condiciones de carrera a hacerlo de esta manera. ¿Cómo puedo hacerlo correctamente?
Usted puede simplemente coger el FileExistsError
e intente abrir el archivo con el modo de creación exclusiva.
abrir para la creación exclusiva, en su defecto si el archivo ya existe
def users_csv_file_init():
try:
with open("users.csv", 'x') as output_file:
writer = csv.writer(output_file)
writer.writerow(["userid", "username", "fname", "lname", "uuid"])
except FileExistsError:
pass