Python 2.7 CSV模块需要unicode,但不需要';我不想要unicode

Python 2.7 CSV模块需要unicode,但不需要';我不想要unicode,python,csv,python-2.7,unicode,error-handling,Python,Csv,Python 2.7,Unicode,Error Handling,我得到一个TypeError:必须是unicode,而不是str。打印第一行的类型时,我看到。当我打印第一行时,我会看到['project\u number','project\u location'](列表比这长,但仍以这种样式继续。) 这个程序在Python3.3中运行良好。我用3to2移植了它,从unix切换到windows 如何使该程序编写流畅 注意:根据官方文档,这个版本的csv模块不支持Unicode输入,但它告诉我无论如何要给它Unicode输入 完全例外 csvfile_ = o

我得到一个
TypeError:必须是unicode,而不是str
。打印第一行的类型时,我看到
。当我打印第一行时,我会看到
['project\u number','project\u location']
(列表比这长,但仍以这种样式继续。)

这个程序在Python3.3中运行良好。我用3to2移植了它,从unix切换到windows

如何使该程序编写流畅

注意:根据官方文档,这个版本的csv模块不支持Unicode输入,但它告诉我无论如何要给它Unicode输入

完全例外

csvfile_ = open(finishedFileName+num+".csv","w",newline='')
writ = csv.writer(csvfile_, dialect='excel')
firstline = unicode(str(firstline))
try:
    writ.writerow(firstline)
except TypeError:
    print firstline
    print type(firstline)
    raise
回溯(最近一次呼叫最后一次):
文件“C:\Users\urightswt\Downloads\LogModToConvert.py”,第382行,在
流程(marketingLogExportFileName)
文件“C:\Users\urightswt\Downloads\LogModToConvert.py”,第123行,正在处理中
写入(csvfile,修改,第一行)
文件“C:\Users\urightswt\Downloads\LogModToConvert.py”,第114行,以书面形式
write.writerow(第一行)
TypeError:必须是unicode,而不是str
如果我取出代码来生成第一行unicode,我会得到

Traceback (most recent call last):
  File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 382, in <module>
    process(marketingLogExportFileName)
  File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 123, in process
    writing(csvfile,modified,firstline)
  File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 114, in writing
    writ.writerow(firstline)
TypeError: must be unicode, not str
回溯(最近一次呼叫最后一次):
文件“C:\Users\urightswt\Downloads\LogModToConvert.py”,第382行,在
流程(marketingLogExportFileName)
文件“C:\Users\urightswt\Downloads\LogModToConvert.py”,第123行,正在处理中
写入(csvfile,修改,第一行)
文件“C:\Users\urightswt\Downloads\LogModToConvert.py”,第114行,以书面形式
write.writerow(第一行)
TypeError:必须是unicode,而不是str

不幸的是,
3to2
使用了
io.open()
调用而不是内置的Python 2
open()
函数。这将以文本模式打开文件,这与Python3上一样需要Unicode输入

但是,
csv
模块不支持Unicode数据;它当然不会产生Unicode

您必须在Python 2上以二进制模式打开文件:

Traceback (most recent call last):
  File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 382, in <module>
    process(marketingLogExportFileName)
  File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 123, in process
    writing(csvfile_,modified,firstline)
  File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 114, in writing
    writ.writerow(firstline)
TypeError: must be unicode, not str
您必须使用
'wb'
作为模式


如果您试图写出unicode数据,则必须先对该数据进行编码,然后再将其传递给
csv.writer()
对象。在编写之前,它包含了使Unicode编码更容易的代码。

我在open()和csv上也遇到了同样的问题。一位朋友给了我解决方案,那就是使用open_output()而不是open()。open_output()默认为“wb”而不是文本。

Martijn Pieters使用“w”或“wb”的解决方案似乎不起作用,因为有换行符。我个人有一个错误

csvfile_ = open(finishedFileName + num + ".csv", 'wb')
我真的不明白,我希望
io
忽略它,而不是引发异常。 在python 2和python 3上对我都有效的唯一解决方案是:

ValueError: binary mode doesn't take a newline argument
如果sys.version\u info.major<3:
打开(我的csv文件“rb”)
其他:
打开(我的csv文件'r',换行符='')
当您打开大量文件时,解决方案可能会变得非常沉重。Martijn解决方案在这方面更干净,只要它能工作就好了

编辑: 我认为,在开发一个经常需要读/写文件的包时,最干净的解决方案是创建一个可以在包中任何地方调用的小型实用程序函数:

if sys.version_info.major < 3:
    open(my_csv_file, 'rb')
else:
    open(my_csv_file, 'r', newline='')
导入系统 输入io def open_csv_rb(我的文件): 如果系统版本信息[0]<3: 返回io.open(我的_文件'rb') 其他: 返回io.open(我的_文件'r',encoding='utf8') def open_csv_wb(我的文件): 如果系统版本信息[0]<3: 返回io.open(我的_文件'wb') 其他: 返回io.open(我的_文件'w',换行符='',编码='utf8')
您只查看例外情况;删除
TypeError
并查看完整的回溯。Python 2.7中的
csv
模块被记录为不支持unicode。什么是
csvfile
?它是用自动编码Unicode的
io
codecs
模块打开的开放文件对象吗?如果是这样,那么需要Unicode的是该文件对象,而不是CSV模块。请向我们显示打开文件对象的代码。
open
从何处导入?Python 2上内置的
open()
函数不接受
newline
参数。请尝试使用unicodesv。它用unicode包装CSV。我试图编写一个CSV处理程序,该程序应该使用Python 2或Python 3运行,我发现这个答案(通过搜索引擎找到)很有帮助。我很惊讶成为第一个投票支持它的用户。可能是因为您错过了future.builtins import open中的
?我认为
新行
在Python2中不是开放的。@moose:这就是答案的全部要点;另见对该问题的评论。从io导入打开时导入
<代码>未来内置项
不包括
打开
。我提供了使代码
3to2
兼容的选项。@moose:换句话说,在python3中,
open()
调用没有import语句;正是
3to2
工具将其添加到中。
if sys.version_info.major < 3:
    open(my_csv_file, 'rb')
else:
    open(my_csv_file, 'r', newline='')
import sys
import io

def open_csv_rb(my_file):
    if sys.version_info[0] < 3:
        return io.open(my_file, 'rb')
    else:
        return io.open(my_file, 'r', encoding='utf8')

def open_csv_wb(my_file):
    if sys.version_info[0] < 3:
        return io.open(my_file, 'wb')
    else:
        return io.open(my_file, 'w', newline='', encoding='utf8')