Python中的Unicode编码数据出现问题

30 浏览
0 Comments

Python中的Unicode编码数据出现问题

你们好,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中正确读取它?

谢谢!

admin 更改状态以发布 2023年5月21日
0
0 Comments

Alexey Smirnov的回答非常优雅,但对于初学者来说可能有点复杂。因此,让我给出一个更接近问题代码的示例。

当使用Python 2读取文件时,您将获取内容作为str,而不是unicode。您可能希望尽快进行转换。然而,csv模块的文档说:“这个版本的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")

0
0 Comments

csv模块文档提供了一个如何处理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

0