Sco*_*oby 1 python csv utf-16 python-2.7
我试图解析一个csv文件,其中包含英语和印地语字符,我正在使用utf-16.它工作正常,但一旦它击中印地语charatcer它失败了.我在这里不知所措.
继承人代码 - >
import csv
import codecs
csvReader = csv.reader(codecs.open('/home/kuberkaul/Downloads/csv.csv', 'rb', 'utf-16'))
for row in csvReader:
print row
Run Code Online (Sandbox Code Playgroud)
我得到的错误是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$
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
编辑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
Run Code Online (Sandbox Code Playgroud)
正如文档所说,在顶部附近的一个大注:
此版本的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
Run Code Online (Sandbox Code Playgroud)
当然,这print不会非常有用,因为str列表使用了repr每个元素,所以你会得到像[u'foo', u'bar', u'\u0910\u0911']...
你可以用通常的方式解决这个问题 - 例如,print u', '.join(row)如果你还记得它会工作u,如果Python能够猜测你的终端的编码(它可以在Mac和现代的Linux上,但可能无法在Windows和旧的Linux上,在这种情况下,您需要encode在每列上映射显式).