1

我正在尝试解析一个包含英语和印地语字符的 csv 文件,并且我正在使用 utf-16。它工作正常,但一旦它击中印地语字符,它就会失败。我在这里不知所措。

这是代码-->

import csv
import codecs

csvReader = csv.reader(codecs.open('/home/kuberkaul/Downloads/csv.csv', 'rb', 'utf-16'))
for row in csvReader:
        print row

我得到的错误是 Traceback (最近一次通话最后一次):

>  File "csvreader.py", line 8, in <module>
>     for row in csvReader: UnicodeEncodeError: 'ascii' codec can't encode characters in position 11-18: ordinal not in range(128)
> kuberkaul@ubuntu:~/Desktop$

我该如何解决这个问题?

编辑1:

我尝试了解决方案并使用了 unicdoe csv 阅读器,现在它给出了错误:

UnicodeDecodeError:“ascii”编解码器无法解码位置 0 的字节 0xff:序数不在范围内(128)

代码是:

import csv
import codecs, io


def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
    # csv.py doesn't do Unicode; encode temporarily as UTF-8:
    csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),
                            dialect=dialect, **kwargs)
    for row in csv_reader:
        # decode UTF-8 back to Unicode, cell by cell:
        yield [unicode(cell, 'utf-8') for cell in row]

def utf_8_encoder(unicode_csv_data):
    for line in unicode_csv_data:
        yield line.encode('utf-8')

filename = '/home/kuberkaul/Downloads/csv.csv'
reader = unicode_csv_reader(codecs.open(filename))
  print reader
for rows in reader:
  print rows
4

1 回答 1

6

正如文档所说,在顶部附近的一个大注释中:

此版本的 csv 模块不支持 Unicode 输入。此外,目前还有一些关于 ASCII NUL 字符的问题。因此,为了安全起见,所有输入都应该是 UTF-8 或可打印的 ASCII;请参阅示例部分中的示例。

如果您点击该示例的链接,它会向您展示解决方案:将每一行编码为 UTF-8,然后再将其传递给csv. 他们甚至为您提供了一个很好的包装器,因此您只需替换csv.readerwith即可unicode_csv_reader,其余代码保持不变:

csvReader = unicode_csv_reader(codecs.open('/home/kuberkaul/Downloads/csv.csv', 'rb', 'utf-16'))
for row in csvReader:
    print row

当然print不会很有用,因为str列表的 使用repr每个元素的,所以你会得到类似[u'foo', u'bar', u'\u0910\u0911']......

你可以用通常的方法来解决这个问题——例如,print u', '.join(row)如果你记得u,并且 Python 能够猜测你的终端的编码(它可以在 Mac 和现代 linux 上,但可能无法在 Windows 和旧 linux 上,在这种情况下,您需要encode在每列上映射一个显式)。

于 2013-07-15T18:25:18.530 回答