Skip to main content
 首页 » 编程设计

python之在python中用英文和印地文字符解析csv文件

2025年05月04日16xxx_UU

我正在尝试解析一个包含英文和印地文字符的 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' codec can't decode byte 0xff in position 0: ordinal not in range(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 

请您参考如下方法:

作为the documentation在顶部附近的大注释中说:

This version of the csv module doesn’t support Unicode input. Also, there are currently some issues regarding ASCII NUL characters. Accordingly, all input should be UTF-8 or printable ASCII to be safe; see the examples in section Examples.

如果您点击该示例的链接,它会向您展示解决方案:在将每一行传递给 csv 之前将其编码为 UTF-8。他们甚至为您提供了一个很好的包装器,因此您只需将 csv.reader 替换为 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']...

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