这是我在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
答案 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")
...