Python中Unicode编码数据的问题

时间:2016-03-21 12:03:01

标签: python csv unicode encoding utf

Hello StackOverflow社区。

我是Python的新用户,所以提前抱歉这个问题的愚蠢!但是我已经尝试了几个小时来修复它,但仍然没有弄清楚它。

我正在尝试导入一个大型文本数据集,以便在Python中对其进行操作。

此数据集位于.csv中,由于编码问题,我在读取数据时遇到了问题。

我尝试使用notepad ++以UTF-8文本对其进行编码 我在Python中尝试了csv.reader模块

以下是我的代码示例:

import csv
with open('twitter_test_python.csv') as csvfile:
    #for file5 in csvfile:
    #    file5.readline()
    #csvfile = csvfile.encode('utf-8')
    spamreader = csv.reader(csvfile, delimiter=str(','), quotechar=str('|')
    for row in spamreader:
        row = " ".join(row)
        row2= str.split(row)
    listsw = []
    for mots in row2:
        if mots not in sw:
            del mots
    print row2

但是当我用Python导入数据时,我仍然有编码问题(重音等),无论我使用的是哪种方法。

如何对数据进行编码,以便Python可以正确读取?

谢谢!

2 个答案:

答案 0 :(得分:0)

csv module documentation 提供了如何处理unicode的示例:

import csv,codecs,cStringIO

class UTF8Recoder:
    def __init__(self, f, encoding):
        self.reader = codecs.getreader(encoding)(f)
    def __iter__(self):
        return self
    def next(self):
        return self.reader.next().encode("utf-8")

class UnicodeReader:
    def __init__(self, f, dialect=csv.excel, encoding="utf-8-sig", **kwds):
        f = UTF8Recoder(f, encoding)
        self.reader = csv.reader(f, dialect=dialect, **kwds)
    def next(self):
        '''next() -> unicode
        This function reads and returns the next line as a Unicode string.
        '''
        row = self.reader.next()
        return [unicode(s, "utf-8") for s in row]
    def __iter__(self):
        return self

class UnicodeWriter:
    def __init__(self, f, dialect=csv.excel, encoding="utf-8-sig", **kwds):
        self.queue = cStringIO.StringIO()
        self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
        self.stream = f
        self.encoder = codecs.getincrementalencoder(encoding)()
    def writerow(self, row):
        '''writerow(unicode) -> None
        This function takes a Unicode string and encodes it to the output.
        '''
        self.writer.writerow([s.encode("utf-8") for s in row])
        data = self.queue.getvalue()
        data = data.decode("utf-8")
        data = self.encoder.encode(data)
        self.stream.write(data)
        self.queue.truncate(0)

    def writerows(self, rows):
        for row in rows:
            self.writerow(row)

with open('twitter_test_python.csv','rb') as spamreader:
    reader = UnicodeReader(fin)
    for line in reader:
        #do stuff
        print line

答案 1 :(得分:0)

Alexey Smirnov's answer很优雅,但初学者可能有点复杂。因此,让我举一个更接近问题代码的例子。

使用Python 2读取文件时,内容为str,而不是unicode。可能你想尽快转换它。但是,documentation of the csv module表示"此版本的csv模块不支持Unicode输入。"所以你应该编码csv.reader的输出,而不是输入。将其插入代码会导致:

import csv
with open('twitter_test_python.csv') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=str(','), quotechar=str('|'))
    for row in spamreader:
        row = " ".join(row)
        row = unicode(row, encoding="utf-8")
        row2 = row.split()

但是,你可能想要考虑是否只是为了再次拆分它们而加入细胞就是你想要的。如果没有它,代码将如下所示。如果列表元素包含空格,则结果不同。

import csv
with open('twitter_test_python.csv') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=str(','), quotechar=str('|'))
    for row in spamreader:
        row2 = list(unicode(cell, encoding="utf-8") for cell in row)

如果您要将某些内容写回文件,则应首先将unicode转换回str unicode.encode("utf-8")