将unicode写入python文件时出错

将unicode写入python文件时出错,python,unicode,Python,Unicode,这是我用python编写的第一个程序,在将utf-8数据写入文件时需要一些帮助 其目的是从excel文件读取数据,并将逗号分隔的数据写入文本文件,下面是我正在运行的代码,它给出了下面的粘贴错误 import xlrd import csv import codecs wb = xlrd.open_workbook('/etl/dev/input/CustList.xls') sh = wb.sheet_by_index(1) file_output = codecs.open('/etl/

这是我用python编写的第一个程序,在将utf-8数据写入文件时需要一些帮助

其目的是从excel文件读取数据,并将逗号分隔的数据写入文本文件,下面是我正在运行的代码,它给出了下面的粘贴错误

import xlrd
import csv
import codecs


wb = xlrd.open_workbook('/etl/dev/input/CustList.xls')
sh = wb.sheet_by_index(1)

file_output = codecs.open('/etl/dev/input/CustList.csv', 'w', 'utf-8')

for rownum in xrange(sh.nrows):
    file_output.write(sh.row_values(rownum))
file_output.close()
这里是错误

Traceback (most recent call last):
  File "TestXls2Csv.py", line 20, in <module>
    file_output.write(sh.row_values(rownum))
  File "/fstools/gptools/ext/python/lib/python2.6/codecs.py", line 686, in write
    return self.writer.write(data)
  File "/fstools/gptools/ext/python/lib/python2.6/codecs.py", line 351, in write
    data, consumed = self.encode(object, self.errors)
TypeError: coercing to Unicode: need string or buffer, list found
对于excel的一页,它似乎工作正常,但对于另一页,它给出了以下错误

回溯(最近一次呼叫最后一次): 文件“testxls2cv.py”,第12行,在 文件_输出.write(“,”.join(sh.row_值(rownum))+“\n”) TypeError:sequence item 8:expected string或Unicode,float foundI最初尝试使用csv.writer,但其中一个单元格中存在\xa0字符,这造成了很多麻烦,因此安装了编解码器并努力使其正常工作

下面是有关excel文档的信息,如果这提供了任何见解

==文件:CustList.xls===
打开花了3.03秒

BIFF版本:8;日期模式:0 代码页:1200(编码:utf_16_le);国家:(1,1) 最后保存人:u'Rajesh,Vatha' 数据表数量:2 使用mmap:1;格式:0;点播:0 不规则行:0 加载时间:0.01秒(第1阶段)1.86秒(第2阶段)

第0页:名称=u‘成员’;nrows=29966;ncols=11

第1页:名称=u'PHYSICANS';nrows=1619;ncols=19

命令花费了0.20秒请建议

感谢Zulfi

是正确的,因为file_output.write应该使用string作为参数,但是sh.row_values(rownum)返回一个列表,这是主要原因

如果要将文件从xls复制到csv,请执行以下操作

import xlrd
import csv
import codecs

wb = xlrd.open_workbook('/etl/dev/input/CustList.xls')

table = wb.sheet_by_index(1)
nrows = table.nrows

with codecs.open('/etl/dev/input/CustList.csv', 'w', 'utf-8') as file_output:
    spamwriter = csv.writer(file_output)
    for i in range(nrows):
        spamwriter.writerow(table.row_values(i))

如果希望输出文件中的值以逗号分隔,只需更改write命令即可将值列表连接到逗号分隔的字符串

但首先必须将列表中的每个值转换为字符串,因为
row\u values()
将返回一个字符串和浮点值列表

...
row_values = [str(val) for val in sh.row_values(rownum)]
file_output.write(",".join(row_values) + "\n")
...

我认为问题在于sh.row_values(rownum)是一个列表(row_values返回给定行中单元格值的一部分),而不是一个字符串,因此不能将其传递给write()。如果你想写所有的行,你应该迭代每个单元格,输出文件应该是什么样子?举一些例子。输出应该包含每个excel行中的数据,作为文本文件中逗号分隔的列。如果您混淆了问题更新。你试过我的新答案了吗?非常感谢你的回答。我试图避免使用csv.writer,因为我在使用csv writer UnicodeEncodeError时遇到以下错误:“ascii”编解码器无法对位置10中的字符u'\xa0'进行编码:序号不在范围内(128)。感谢您的回复。尝试了上面的方法,这次我想在将数据放入字符串时会出现问题。这个u'\xa0'有很多问题:(我希望有一个简单的替代方法,可以将excel中的任何字符转储到文本文件。
回溯(最后一次调用):文件“testxls2cv.py”,第12行,第w行中的值=[str(val)表示sh.row中的值(rownum)]UnicodeEncodeError:“ascii”编解码器无法对位置10中的字符u'\xa0'进行编码:序号不在范围(128)
将str(val)更改为repr(val),但不知道有什么区别,并且除了字符串是单引号并以“u”作为前缀外,它还能工作。
...
row_values = [str(val) for val in sh.row_values(rownum)]
file_output.write(",".join(row_values) + "\n")
...