2015-07-22 2 views
1

J'ai un problème très étrange où je ne peux pas ouvrir un fichier à partir d'un de mes plus gros scripts.Ouvrir le fichier binaire np.memmap() dans un gestionnaire de contexte python

Ce problème est intermittent et je n'arrive pas à comprendre l'erreur. Je reçois cette erreur:

IOError: [Errno 22] invalid mode ('w+') or filename: 'D:\\R4a\\2014_05\\R01359\\R01359_data_dwnhi.dat' 

de cette commande dans mon script:

with open(os.path.normpath(os.path.join(sonpath,base+'_data_dwnhi.dat')), 'w+') as ff: 
    fp = np.memmap(ff, dtype='int16', mode='w+', shape=np.shape(tmp2)) 

quand j'utilise:

if os.path.exists(os.path.normpath(os.path.join(sonpath,base+'_data_dwnhi.dat')))== True: 
    print os.path.normpath(os.path.join(sonpath,base+'_data_dwnhi.dat')) + ' is a file' 

comme il évalue True. Aussi quand je lance la commande open par lui-même en ipython il ouvre le fichier avec sucessfully:

open('D:\\R4a\\2014_05\\R01359\\R01359_data_dwnhi.dat', 'w+') 

Je suis à une perte pour les mots et je pense que errno 22 erreur est trompeur. Comme je l'ai dit plus tôt, le problème est intermittent et fonctionne sur certains fichiers. Est-ce que quelqu'un a une idée de ce que je fais mal?

Je travaille sur une machine Windows 8 64 bits et exécute la version 2.7.8 en python à partir d'une distribution Anaconda 2.1.0 (64 bits).

Répondre

0

Votre ouverture comme un fichier normal, d'où l'erreur: IOError: [Errno 22] invalid mode. Pour ce faire, à la place:

with open(path, 'wb') as f: 
    pass 
+0

J'ai essayé les modes 'wb',' w + b' et 'w +'. Le mode 'w +' fonctionne sur certains fichiers mais pas sur d'autres. Et pourquoi cela fonctionnerait-il avec le mode 'w +' quand je le passerais à l'interpréteur python? – dubbbdan

+0

Avez-vous vraiment? Votre trace n'est pas d'accord avec vous. 'wb' est pour l'ouverture en mode binaire. Il n'y a aucun intérêt à ouvrir un fichier dans w +: le symbole plus ne fait rien. Avez-vous lu la documentation pertinente? – Zizouz212

+0

J'ai vraiment. J'ai essayé de déboguer cela pendant un certain temps maintenant et je sens que quelqu'un d'autre a déjà rencontré ce problème. Le mode 'w +' ouvre un fichier pour la lecture et l'écriture. Si je comprends bien, le '+' vous permet de remplacer le contenu des fichiers. Il peut être trouvé [ici] (http://www.tutorialspoint.com/python/python_files_io.htm) et [ici] (https://docs.python.org/2/library/io.html). – dubbbdan

0

après quelques erreurs procès enseignons np.memmap() pour ouvrir un fichier avec autre que .__doc__ rapporté mode cordes.

#------------------------------------------------------++++++++ TRY: 
#              |||||||| 
#              vvvvvvvv 
|>>> MM = np.memmap("temporary_DATA.memmap", mode = 'wNONSENSE+') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27.anaconda\lib\site-packages\numpy\core\memmap.py", line 208, in __new__ 
    (valid_filemodes + list(mode_equivalents.keys()))) 
ValueError: mode must be one of ['r', 'c', 'r+', 'w+', 'readwrite', 'write', 'readonly', 'copyonwrite'] 
#        ^^^ ^ ^  ^ ^  ^
#         | | |  |  |   |  |   | 
#---------------------------------+----+----+-----+-----+------------+--------+-----------+ 

enfin cette retraçage d'erreur a montré des chaînes alternatives, qui ne figurent pas dans np.memmap.__doc__, qui ne fonctionnent bien

with open(os.path.normpath(os.path.join(sonpath, 
              base + '_data_dwnhi.dat' 
              ) 
          ), 
      'w+' 
      ) as ff: 
    fp = np.memmap(ff, mode = 'readwrite',  # options listed in np Traceback 
         shape = np.shape(tmp2), 
         dtype = 'int16' 
         ) 

Pour pythoneers bellicistes, le poste utilise intentionnellement source non-PEP-8 La mise en forme du code, car les auteurs constatent qu'au cours d'une phase d'apprentissage, la capacité de lecture du code améliore la focalisation sur la solution des tâches et permet de s'habituer aux concepts sous-jacents plutôt que de se concentrer sur la typographie. Espérons que le principe de fournir de l'aide est respecté et le format de style non-PEP-8 est pardonné au nom de la facilité de lecture.