web-dev-qa-db-fra.com

Autorisation refusée lorsque la base de données pandas est transférée sur un fichier csv dans tempfile

J'essaie de stocker un fichier de données pandas dans un fichier temporaire au format csv (sous windows), mais je suis touché par:

[Errno 13] Autorisation refusée: 'C:\Utilisateurs\Nom d'utilisateur\AppData\Local\Temp\tmpweymbkye'

import tempfile
import pandas

with tempfile.NamedTemporaryFile() as temp:
    df.to_csv(temp.name)

Où df est le cadre de données. J'ai également essayé de changer le répertoire temporaire en un répertoire dont je suis sûr que j'ai les droits en écriture:

tempfile.tempdir='D:/Username/Temp/'

Cela me donne le même message d'erreur

Modifier:

Le fichier temporaire semble être verrouillé pour l'édition comme lorsque je modifie la boucle en:

with tempfile.NamedTemporaryFile() as temp:
    df.to_csv(temp.name + '.csv')

Je peux écrire le fichier dans le répertoire temporaire, mais il n'est pas automatiquement supprimé à la fin de la boucle car il ne s'agit plus d'un fichier temporaire.

Cependant, si je change le code en:

with tempfile.NamedTemporaryFile(suffix='.csv') as temp:
    training_data.to_csv(temp.name)

Je reçois le même message d'erreur qu'avant. Le fichier n'est ouvert nulle part ailleurs.

6
thebigspin

Vérifiez vos autorisations et, selon this post, vous pouvez exécuter votre programme en tant qu'administrateur par un clic droit et l'exécuter en tant qu'administrateur.

Nous pouvons utiliser la commande to_csv pour exporter un DataFrame au format CSV. Notez que le code ci-dessous enregistrera par défaut les données dans le répertoire de travail en cours. Nous pouvons l'enregistrer dans un autre dossier en ajoutant le nom de dossier et une barre oblique au fichier. 

verticalStack.to_csv('foldername/out.csv').

Vérifiez votre répertoire de travail pour vous assurer que le CSV a été écrit correctement et que vous pouvez l'ouvrir! Si vous le souhaitez, essayez de le ramener en python pour vous assurer qu'il importe correctement.

newOutput = pd.read_csv('out.csv', keep_default_na=False, na_values=[""])

ref

Contrairement à TemporaryFile(), l'utilisateur de mkstemp() est responsable de la suppression du fichier temporaire une fois celui-ci terminé.

Avec l'utilisation de cette fonction peut introduire une faille de sécurité dans votre programme. Au moment où vous parvenez à faire quoi que ce soit avec le nom de fichier renvoyé, quelqu'un d'autre vous a peut-être battu. mktemp() usage peut être facilement remplacé par NamedTemporaryFile(), en lui passant le delete=False paramete.

Lire la suite .

Après l'exportation vers CSV, vous pouvez fermer votre fichier avec temp.close().

with tempfile.NamedTemporaryFile(delete=False) as temp:
    df.to_csv(temp.name + '.csv')
    temp.close()
1
RaminNietzsche

Parfois, cela donne cette erreur simplement parce qu’il existe un autre fichier portant le même nom et qu’il n’est pas autorisé à supprimer le fichier précédent et à le remplacer par le nouveau fichier.

  1. Vous pouvez donc nommer le fichier différemment tout en l’enregistrant ..__ ou
  2. Si vous travaillez sur Jupyter Notebook ou un autre environnement similaire, supprimez le fichier après avoir exécuté la cellule qui le lit en mémoire. Ainsi, lorsque vous exécutez la cellule qui l'écrit sur la machine, aucun autre fichier portant ce nom n'existe .
1
prathik shirolkar

Parfois, vous devez vérifier le chemin du fichier si vous avez les droits nécessaires pour lire et écrire le fichier. Surtout quand vous utilisez le chemin relatif.

xxx.to_csv('%s/file.csv'%(file_path), index = False)
0
saneryee