【问题标题】:Python file open function modesPython文件打开功能模式
【发布时间】:2015-07-19 14:36:00
【问题描述】:

我注意到,除了记录的模式字符外,Windows XP 和 8.1 中的 Python 2.7.5.1 至少在读取文件时也接受模式 UD。模式U 用于numpy 的genfromtxt。模式D具有删除文件的效果,如下代码片段:

 f = open('text.txt','rD')
 print(f.next())
 f.close()  # file text.txt is deleted when closed

是否有人对这些模式有更多了解,尤其是它们是否是适用于 Linux 系统的语言的永久特性?

【问题讨论】:

  • open('text.txt','rD') 对于 Linux 上的现有文件不会对我产生任何错误,尽管该文件在关闭时不会被删除。如果是真的,我真的很惊讶,这种行为是not documentedU 标志已记录在案。
  • 刚刚在 Windows 上复制了这个。这确实很奇怪。
  • 我刚才犯了同样的错误。提及的是here。在文件对象而不是 io.
  • @tmr232 能给个python和os版本吗?你指的是什么错误?
  • Windows 8,Python 2.7.10 32 位。

标签: python


【解决方案1】:

D 标志似乎是特定于 Windows 的。 Windows 似乎在其 CRT 中的 fopen 函数中添加了几个标志,如 here 所述。

虽然 Python 会过滤模式字符串以确保不会出现错误,但它确实允许一些特殊标志,如 Python 源代码 here 中所示。具体来说,似乎N 标志被过滤掉了,而TD 标志被允许:

while (*++mode) {
    if (*mode == ' ' || *mode == 'N') /* ignore spaces and N */
        continue;
    s = "+TD"; /* each of this can appear only once */
    ...

我建议坚持使用记录在案的选项以保持代码跨平台。

【讨论】:

【解决方案2】:

这有点误导。 open() 作为模式 arg 接受任何字符,而您传递一个有效字符,即:"w,r,b,+,a"

因此你可以写:open("fname", "w+ANYTHINGYOUWANT")。 它将以open("fname", "w+") 的形式打开文件。 和open("fname", "rANYTHINGYOUWANT")。 将以open("fname", "r") 打开文件。

关于“U”标志:

除了标准的 fopen() 值之外,模式可能是“U”或“rU”。 Python 通常是用通用换行支持构建的;提供'U' 将文件作为文本文件打开,但行可能被任何终止 以下:Unix 行尾约定 '\n'、Macintosh 约定“\r”,或 Windows 约定“\r\n”。所有这些 Python 程序将外部表示视为“\n”。如果 Python 是在没有通用换行符的情况下构建的,支持带有“U”的模式 与普通文本模式相同。请注意,这样打开的文件对象也 有一个名为 newlines 的属性,其值为 None (如果没有 换行符)、'\n'、'\r'、'\r\n' 或元组 包含所有看到的换行符类型。

您可以在 Python 文档中阅读 https://docs.python.org/2/library/functions.html#open

编辑:

D:将文件指定为临时文件。当最后一个文件被删除 指针已关闭。

您可以在@tmr232 的链接中阅读。

c、n、t、S、R、T 和 D 模式选项是 Microsoft 扩展 fopen 和 _fdopen 并且不应该在 ANSI 可移植性需要的地方使用 想要的

进一步更新:

我建议将此现象作为错误提交,因为以只读方式打开文件,即带有标志“r”,然后允许在/通过添加单个字符(如“D”)后删除,甚至不小心我认为这是一个严重的安全问题。

但是,如果这有一些不可避免的功能,请通知我。

【讨论】:

  • 我无法重现,但我想这可能是其他一些潜在文件问题?
  • @rth 被转载见上面的 tmr232 回复,能否给 U 文档提供参考?
  • @GyörgySolymosi 请给python和os版本
  • @user2422503 Linux下的Python 2.7.9
  • 是的,使用open(..., 'rD')时肯定会删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多