将unicode写入文件python时出错

时间:2014-06-04 07:27:08

标签: 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/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

非常感谢任何帮助。

由于 Zulfi

尝试以下

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

对于一张excel似乎工作正常,但是对于另一张表格给出了以下错误

追踪(最近一次通话):   File&#34; TestXls2Csv.py&#34;,第12行,in     file_output.write(&#34;,&#34; .join(sh.row_values(rownum))+&#34; \ n&#34;) TypeError:序列项8:期望的字符串或Unicode,float foundI最初尝试使用csv.writer,但其中一个单元格中有一个\ xa0字符,这导致了很多麻烦,因此安装了编解码器并争取使其工作。

以下是有关excel文档的信息,如果能提供任何见解

===文件:CustList.xls ===
打开需要3.03秒

BIFF版本:8; datemode:0 codepage:1200(编码:utf_16_le);国家:(1,1) 最后保存者:u&#39; Rajesh,Vatha&#39; 数据表数量:2 使用mmap:1;格式:0;按需:0 衣衫褴褛的行:0 加载时间:0.01秒(第1阶段)1.86秒(第2阶段)

表0:name = u&#39;会员&#39 ;; nrows = 29966; ncols = 11

表1:name = u&#39; PHYSICANS&#39 ;; nrows = 1619; ncols = 19

命令耗时0.20秒请提示。

谢谢Zulfi

2 个答案:

答案 0 :(得分:1)

dciriello是对的,因为file_output.write应该以字符串作为参数,但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))

答案 1 :(得分:1)

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

但首先你必须将列表中的每个值转换为字符串,因为row_values()返回一个包含字符串和浮动值的列表。

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