Python中的Unicode编码数据出现问题
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日
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")
。
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