【问题标题】:Open np.memmap() binary file within a python with-context manager在带有上下文管理器的 python 中打开 np.memmap() 二进制文件
【发布时间】:2015-07-22 21:01:54
【问题描述】:

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

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

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。此外,当我在ipython 中单独运行open 命令时,它会成功打开文件:

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。

【问题讨论】:

    标签: python numpy errno numpy-memmap


    【解决方案1】:

    您像普通文件一样打开它,因此出现错误:IOError: [Errno 22] invalid mode。改为这样做:

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

    【讨论】:

    • 我尝试过wbw+bw+ 模式。 w+ 模式适用于某些文件,而不适用于其他文件。当我将它传递给 python 解释器时,为什么它会在 w+ 模式下工作?
    • 真的吗?您的回溯不同意您的看法。 wb 用于以二进制模式打开。在w+ 中打开文件是没有意义的:加号没有任何作用。您是否阅读过相关文档?
    • 我真的有。我一直在尝试调试它很长一段时间,并且觉得其他人之前可能遇到过这个问题。模式w+ 打开一个文件进行读写。据我了解,+ 允许您覆盖文件内容。可以找到herehere
    • 我不知道,我以前肯定没有遇到过这种行为。和你一样,我非常希望有人能够解释这一点。
    • 我一直认为它与运行时编译器有关。我认为这是它可以在解释器中工作而不是在我的脚本中工作的唯一原因。
    【解决方案2】:

    在试错之后,指示 np.memmap() 打开一个文件,而不是 .__doc__ 报告的 mode 字符串。

    #------------------------------------------------------++++++++ 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 的样式格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多