Python中已打开文件.mode属性的字符顺序是否有文档规定?
Python文件对象mode属性的确定性问题
问题背景
需要安全判断传入的类文件对象的模式,核心疑问包括:
- 是否有文档记录已打开文件的所有可能模式?
- 类文件对象
mode属性的字符显示顺序是否有文档规定的确定性(含跨平台)?
虽然可以枚举open()函数mode参数的所有排列,但部分组合无意义(如ax)。实际测试发现,多种等效的模式参数最终返回的.mode值一致,例如:
# 以下四种打开方式的.mode均为rb+ with open('/tmp/foo', 'r+b') as foo: print(foo.mode) # 输出 rb+ with open('/tmp/foo', 'rb+') as foo: print(foo.mode) # 输出 rb+ with open('/tmp/foo', 'br+') as foo: print(foo.mode) # 输出 rb+ with open('/tmp/foo', 'bw+') as foo: print(foo.mode) # 输出 rb+
解答
- 合法模式的文档记录
Python官方文档明确列出了open()函数mode参数的合法组合:
- 基础模式:
r(只读,默认)、w(写入,覆盖原有文件)、x(创建新文件写入,文件存在则报错)、a(追加写入) - 可选后缀:
+(同时支持读写)、b(二进制模式)、t(文本模式,默认,可省略)
无效组合(如ax)会直接抛出ValueError异常,这些合法组合在官方文档中有明确说明。
- mode属性的显示顺序确定性
目前Python官方文档未对mode属性的字符显示顺序做强制规定,但在主流实现CPython中,等效的模式参数会被统一转换为固定的标准格式(比如示例中的rb+)。
跨平台层面,遵循Python规范的实现(如CPython、PyPy)对等效模式的mode返回值通常一致,但不建议依赖这个顺序做严格判断——更可靠的方式是检查模式是否包含特定语义的字符(比如判断是否有b表示二进制,是否有+表示读写,是否有r/w/a表示读写权限),而非依赖字符顺序。
内容的提问来源于stack exchange,提问作者Zev Isert
相关产品推荐
相关产品推荐

