Pandas DataFrame.to_csv generando IOError: No existe tal archivo o directorio

3 minutos de lectura

Avatar de usuario de LoLa
lola

Hola: Estoy tratando de usar el Pandas DataFrame.to_csv método para guardar un dataframe a un csv expediente:

filename="./dir/name.csv"

df.to_csv(filename)

Sin embargo, recibo el error:

IOError: [Errno 2] No such file or directory: './dir/name.csv'

¿No debería el to_csv método puede crear el archivo si no existe? Esto es lo que pretendo que haga.

to_csv crea el archivo si no existe como dijiste, pero no crea directorios que no existen. Asegúrese de que el subdirectorio en el que está intentando guardar su archivo se haya creado primero.

A menudo hago algo como esto en mi trabajo:

import os

outname="name.csv"

outdir="./dir"
if not os.path.exists(outdir):
    os.mkdir(outdir)

fullname = os.path.join(outdir, outname)    

df.to_csv(fullname)

Esto se puede envolver fácilmente en una función si necesita hacer esto con frecuencia.

  • os.mkdir crea solo un directorio inmediato. Si hay varios niveles de directorios en la ruta que no existen, use os.makedirs. Sin embargo, tenga en cuenta que arroja un OSError si la hoja existe

    – mz8i

    24 de agosto de 2018 a las 9:13

  • @mz8i Si un directorio hoja existente es aceptable, os.makedirs se puede llamar con exist_ok=True para evitar el error.

    – stiaan

    30 de marzo de 2020 a las 15:05

Avatar de usuario de Tim
Tim

Aquí hay una forma alternativa de hacer esto usando la excelente biblioteca estándar pathlib módulo, que generalmente hace las cosas más ordenadas.

Como se explica en otra parte, to_csv creará el expediente si no existe, pero no cree directorios inexistentes en la ruta al archivo, por lo que primero debe asegurarse de que existan.

from pathlib import Path

output_file="my_file.csv"
output_dir = Path('long_path/to/my_dir')

output_dir.mkdir(parents=True, exist_ok=True)

df.to_csv(output_dir / output_file)  # can join path elements with / operator

Ajuste parents=True también creará los directorios principales necesarios, y exist_ok=True significa que no generará un error si el directorio ya existe, por lo que no tiene que verificarlo explícitamente por separado.

  • Esto era lo que se quería, también pensé en crear directorios recursivamente usando la implementación anterior. Pero esto es mejor y mucho más simple.

    – Janith

    15 de febrero de 2019 a las 5:56

  • pathlib es un sueño! 😀

    – Tim

    15 de febrero de 2019 a las 21:35

  • @JKK Puedes hacer exactamente lo mismo con os.makedirs('long_path/to/my_dir', exist_ok=True) – Tiene exactamente el mismo comportamiento. Sin embargo, no hay nada malo con el orientado a objetos. pathlib acércate si esa es tu taza de té!

    – qRTPCR

    29 mayo 2019 a las 20:52

  • Si soy completamente honesto, esto fue en parte solo una oportunidad para presentarle a la gente pathlib 😜 … y sí, hablando como británico, ¡es mi taza de té! 😂👌☕

    – Tim

    1 de junio de 2019 a las 16:12

  • Esta debería ser la respuesta aceptada. Una solución mucho más limpia y segura.

    – Vacaciones crujientes

    8 de noviembre de 2021 a las 15:23

Tuve este error cuando agregué accidentalmente file:// al comienzo de la ruta de guardado. Dado que la búsqueda me trajo aquí, también podría ser útil para alguien.

  • ¡Tonto! pd.read_csv no tiene problemas con el file:// prefijo pero por alguna razón to_csv lo hace.

    – KLMiller

    20 de septiembre de 2021 a las 5:55

Avatar de usuario de Morteza
Morteza

Para guardar el archivo ‘csv’ de jupyter en el escritorio:

df.to_csv(r'your directory\your file name.csv', index=False)

Por ejemplo:

df5.to_csv(r'C:\Users\Asus\Desktop\DataSets\compounds\inactive_compounds.csv', index=False) 

¿Ha sido útil esta solución?