【问题标题】:Error in writing unicode to file python将 unicode 写入文件 python 时出错
【发布时间】:2014-06-04 07:27:08
【问题描述】:

这是我在 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

非常感谢任何帮助。

谢谢 祖尔菲

尝试了以下

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

Excel 的一张表似乎工作正常,但另一张表出现以下错误

Traceback(最近一次调用最后一次): 文件“TestXls2Csv.py”,第 12 行,在 file_output.write(",".join(sh.row_values(rownum)) + "\n") TypeError: sequence item 8: expected string or Unicode, float found我最初尝试使用 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: name = u'MEMBER'; nrows = 29966; ncols = 11

表 1:名称 = u'PHYSCANS'; nrows = 1619; ncols = 19

命令耗时 0.20 秒请提出建议。

谢谢祖尔菲

【问题讨论】:

  • 我认为问题在于 sh.row_values(rownum) 是一个列表(row_values 返回给定行中单元格值的一部分。)而不是字符串,所以你不能将其传递给 write()。如果你想写所有行,你应该迭代每个单元格
  • 输出文件应该是什么样子的?举个例子吧。
  • 输出应包含每个 excel 行中的数据,作为文本文件中的逗号分隔列
  • 您混淆了您的问题更新。你试过我的新答案了吗?

标签: python unicode


【解决方案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))

【讨论】:

  • 非常感谢您的回复。我试图避免使用 csv.writer,因为 csv writer UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 10: ordinal not in range(128)
【解决方案2】:

如果您希望输出文件中的值以逗号分隔,您只需更改写入命令,将值列表加入逗号分隔字符串。

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

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

【讨论】:

  • 感谢您的回复。尝试了上述方法,这次我猜在将数据放入字符串时会弹出问题。这个 u'\xa0' 有很多问题 :( 我希望有一个简单的替代方法可以将任何字符从 excel 转储到文本文件。Traceback (most recent call last): File "TestXls2Csv.py", line 12, in &lt;module&gt; row_values = [str(val) for val in sh.row_values(rownum)] UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 10: ordinal not in range(128)
  • 在不知道有什么区别的情况下将 str(val) 更改为 repr(val) 并且它起作用了,除了字符串是单引号并以 'u' 为前缀。
猜你喜欢
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多