我有一个为Python 3构建的Python代码库,它使用带有编码参数的Python 3样式open():
https://github.com/miohtama/vvv/blob/master/vvv/textlineplugin.py#L47
with open(fname, "rt", encoding="utf-8") as f:
Run Code Online (Sandbox Code Playgroud)
现在我想将这个代码反向移植到Python 2.x,这样我就可以拥有一个适用于Python 2和Python 3的代码库.
什么是解决open()
差异和缺乏编码参数的推荐策略?
我可以使用Python 3 open()
样式的文件处理程序来处理字节串,所以它会像Python 2一样open()
吗?
在Python中,以下语句不起作用:
f = open("ftmp", "rw")
print >> f, "python"
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 9] Bad file descriptor
Run Code Online (Sandbox Code Playgroud)
但是使用以下代码它可以工作:
g = open("ftmp", "r+")
print >> g, "python"
Run Code Online (Sandbox Code Playgroud)
看起来我需要修改文件模式.文件打开模式的深层复杂性是什么?
我试图从别人的项目中理解这段代码.如果您想要上下文,请访问:https://github.com/newsapps/beeswithmachineguns/blob/master/beeswithmachineguns/bees.py#L501
IS_PY2
只是一个布尔变量,True
如果Python主要版本是2.我知道非空字符串是True
,但由于某种原因我不理解openmode
被指定'w'
或者'wt'
而不是True
或False
.
openmode = IS_PY2 and 'w' or 'wt'
openkwargs = IS_PY2 and {} or {'encoding': 'utf-8', 'newline': ''}
Run Code Online (Sandbox Code Playgroud)
有人能解释一下结果吗?
https://docs.python.org/3/library/gzip.html
我正在考虑使用gzip.open()
,我对这个mode
论点有点困惑:
模式参数可以是二进制模式的'r','rb','a','ab','w','wb','x'或'xb'中的任何一个,或'rt','at' ,'wt'或'xt'用于文本模式.默认值为'rb'.
那么'w'
和之间的区别是什么'wb'
?
该文件表明它们都是二进制模式.
那么这是否意味着'w'
和之间没有区别'wb'
?