Python2和3 csv模块文本二进制模式向后兼容性
我想创建一个与Python 2.7-3.6兼容的代码。我正在尝试修复csv模块的一个问题,最初我在Python 2.7中使用了Python2和3 csv模块文本二进制模式向后兼容性,python,python-3.x,python-2.7,csv,backwards-compatibility,Python,Python 3.x,Python 2.7,Csv,Backwards Compatibility,我想创建一个与Python 2.7-3.6兼容的代码。我正在尝试修复csv模块的一个问题,最初我在Python 2.7中使用了outfile=open('./test.csv','wb'),现在我必须使用outfile=open('./test.csv','w'),否则我将在 TypeError:需要类似字节的对象,而不是'str' A当我使用以下代码修复时: import sys w = 'w' if sys.version_info[0] < 3: w = 'wb' # Wher
outfile=open('./test.csv','wb')
,现在我必须使用outfile=open('./test.csv','w')
,否则我将在
TypeError:需要类似字节的对象,而不是'str'
A当我使用以下代码修复时:
import sys
w = 'w'
if sys.version_info[0] < 3:
w = 'wb'
# Where needed
outfile=open('./test.csv',w)
导入系统
w='w'
如果系统版本信息[0]<3:
w='wb'
#需要的地方
outfile=open('./test.csv',w)
不是很好,如果我使用Python2.7,在“wb”中打开文件有更好的解决方案吗?如果我使用Python3.x,在
w
中打开文件有更好的解决方案吗?为了澄清,我必须在Python2.7中使用wb
,否则,每次向文件添加新行时,我都会有一个空行。在Python3上打开要与模块csv
一起使用的文件时,您始终应该添加newline=“
打开语句:
import sys
mode = 'w'
if sys.version_info[0] < 3:
mode = 'wb'
# python 3 write
with open("somefile.txt", mode, newline="") as f:
pass # do something with f
即使遇到某种异常,也要关闭文件句柄。这是python 2安全版-请参阅:
处理文件对象时,最好使用with
关键字。这样做的好处是,即使在执行过程中引发异常,文件也会在其套件完成后正确关闭。它也比编写等价的try finally
块短得多
您的解决方案-丑陋但有效:
import sys
python3 = sys.version_info[0] >= 3
if python3:
with open("somefile.txt","w",newline="") as f:
pass
else:
with open("somefile.txt","wb") as f:
pass
问题在于python 2中不存在参数
newline
。要解决这个问题,您必须包装/monkypathopen(..)
,包括contextmanageing 谢谢Patrick,是的,这就是我遇到这个问题的原因,我想解决它,是的,我对语句使用了,我在工作示例中并不是为了简洁。然而,我认为你的答案并没有回答我的问题,这是错误的,因为你编写的代码在2.7中无法运行。在你链接的问题中,没有任何地方提到newline=“
”-在已接受的答案上有一条注释提到了它。链接的问题是关于'wb'
与'w'
和str与bytelike对象(就像你的一样)-而不是关于省略newline=“”
所产生的问题,比如f.e.here:。稍后将删除此答案,因为它似乎与您的问题无关。我没有说任何关于<代码>新行代码>的内容,我只是测试了您的解决方案,但它并没有解决我的问题,您现在的编辑至少可以回答我的问题,所以我投了赞成票,我不想粗鲁,只是试图解决问题并给出反馈
import sys
python3 = sys.version_info[0] >= 3
if python3:
with open("somefile.txt","w",newline="") as f:
pass
else:
with open("somefile.txt","wb") as f:
pass