web-dev-qa-db-fra.com

FileNotFoundError lors de l'écriture dans un fichier Pickle

Je prends tous les noms de fichiers dans un certain répertoire dans un list, et je voudrais écrire cette liste dans un fichier pickle. Voici le code que j'utilise:

import _pickle as pickle
with open(filepath+'filenames.pkl', 'wb') as f:
    pickle.dump(filenames, f)

Cela me donne l'erreur suivante:

---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-32-c59e6889d2fe> in <module>()
      1 import _pickle as pickle
----> 2 with open(dpath+'filenames.pkl', 'wb') as f:
      3     pickle.dump(filenames, f)

FileNotFoundError: [Errno 2] No such file or directory: '/data/train/filenames.pkl'

Je suis censé créer ce fichier, pourquoi ce fichier est-il déjà attendu?

(J'utilise Python 3.6) Toute aide serait très appréciée.

TIA.

8
Patthebug

Dans votre cas, très probablement /data/train/ le répertoire n'existe pas

J'ai essayé ce code et j'ai eu la même erreur:

import pickle as pickle
filenames='sadasdas'
with open('/tmp/not_exist/filenames.pkl', 'wb') as f:
    pickle.dump(filenames, f)

production:

---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-7-6a22c2148796> in <module>()
      1 import pickle as pickle
      2 filenames='sadasdas'
----> 3 with open('/tmp/not_exist/filenames.pkl', 'wb') as f:
      4     pickle.dump(filenames, f)

FileNotFoundError: [Errno 2] No such file or directory: '/tmp/not_exist/filenames.pkl'

Vous pouvez gérer ce problème en vous assurant que le répertoire existe avant d'écrire dans un fichier: l'approche programmatique pour faire de même est la suivante

import os
filename = "/tmp/not_exist/filenames.pkl"
os.makedirs(os.path.dirname(filename), exist_ok=True)
data = 'sadasdas'
with open('/tmp/not_exist/filenames.pkl', 'wb') as f:
    pickle.dump(data, f)

réf: https://stackoverflow.com/a/12517490/3027854

4
Vikash Singh

J'ai également eu le même problème, mais aucune des réponses ne m'a aidé. Les répertoires étaient là et j'ai utilisé wb, mais toujours le même problème.

J'espère que cela aide certains qui ont le même problème: j'ai découvert que le problème était que j'avais beaucoup de dossiers, aussi le nom du fichier était trop long (en raison du fait que j'ai créé le nom de fichier sous forme de chaîne dans dans lequel j'essayais d'indiquer les caractéristiques de ce fichier) et le dossier dans lequel j'essayais de vider soulèverait "Le ou les noms de fichier seraient trop longs pour le dossier de destination" lorsque j'ai essayé de déplacer ce fichier manuellement.

Après avoir raccourci le nom du fichier, le problème a été résolu.

1
Mike

J'ai eu un problème similaire lors de l'écriture en utilisant un chemin d'accès relatif (et un lien symbolique). Le répertoire existait de manière provocante mais il soulevait toujours le FileNotFoundError.

Le problème a disparu lorsque je suis passé à l'utilisation du chemin absolu

abspath = pathlib.Path(filename).absolute()
with open(str(abspath), 'wb') as f:
    pickle.dump(thing_to_pickle, f)
1
pwinty

J'ai dû désactiver 'l'accès contrôlé aux dossiers' à partir de Windows Defender sur Windows 10.

D'autres antivirus/pare-feu peuvent avoir le même effet.

https://support.Microsoft.com/en-us/help/4046851/windows-10-controlled-folder-access-windows-defender-security-center

0
André VR

Assurez-vous que le filepath que vous utilisez est quelque chose qui existe réellement sur votre ordinateur. Parfois, nous copions et collons du code ailleurs et oublions de changer les noms des lecteurs. Vous vous adressez peut-être à un lecteur non existant.

0
agcala