Python2和3 csv模块文本二进制模式向后兼容性

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

我想创建一个与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'
# 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
。要解决这个问题,您必须包装/monkypath
open(..)
,包括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