在python with-context manager中打开np.memmap()二进制文件

时间:2015-07-22 21:01:54

标签: python numpy errno numpy-memmap

我有一个非常奇怪的问题,我无法从我的一个较大的脚本中打开文件。

这个问题是间歇性的,我似乎无法理解错误。 我收到了这个错误:

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

来自我脚本中的此命令:

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))

当我使用时:

 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'

评估为 True 。此外,当我在open中单独运行ipython命令时,它成功打开了以下文件:

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

我不知所措,认为 errno 22 错误会产生误导。正如我之前所说,问题是间歇性的并且适用于某些文件。有谁知道我做错了什么?

我正在使用64位Windows 8机器并从Anaconda 2.1.0(64位)发行版运行python版本2.7.8。

2 个答案:

答案 0 :(得分:0)

您将其打开为普通文件,因此错误:IOError: [Errno 22] invalid mode。这样做:

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

答案 1 :(得分:0)

在发生一些试验错误后,请指示 np.memmap() 打开包含.__doc__报告的 mode 字符串以外的文件。< / p>

#------------------------------------------------------++++++++ 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']
#                                 ^    ^    ^     ^     ^            ^        ^           ^
#                                 |    |    |     |     |            |        |           |
#---------------------------------+----+----+-----+-----+------------+--------+-----------+

最后这个错误Traceback显示了np.memmap.__doc__中未列出的替代字符串,它们可以正常工作

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'
                       )

对于鹰派的pythoneers,该帖子故意使用非PEP-8源代码格式,因为作者体验到在学习阶段,代码读取能力提高了对任务解决方案的关注,并有助于习惯于底层概念而不是花费在正式的印刷术上。希望提供帮助的原则得到尊重,非PEP-8样式格式以易于阅读的名义被宽恕。