首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你能跳过python中的非utf-8数据吗?

你能跳过python中的非utf-8数据吗?
EN

Stack Overflow用户
提问于 2015-05-15 15:34:11
回答 1查看 907关注 0票数 0

我正在处理python中一个非常大的csv文件,其中一些行抛出了一个错误"'utf-8‘编解码器无法解码位置为7657的字节0x9b :无效的开始字节“。有没有一种方法可以跳过不是utf-8的行而不手动删除或修复数据?

代码语言:javascript
复制
for filename in filenames:
f = open(filename, 'rt')
reader = csv.reader(f, delimiter = ',')
for row in reader:
    #process data for future use

我不能使用非utf 8数据,因为后面的进程需要utf-8使用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-15 17:55:04

您可以使用一个筛选器将一行读取为原始字节,然后尝试将其转换为unicode为UTF8,然后:

  • 如果成功,将其传递给csv阅读器。
  • 如果不是,则将其存储以供以后分析。

假设您使用的是Python2,您可以使用以下内容:

代码语言:javascript
复制
class MyFilter:
    def __init__(self, instr, errstr):
        self.instr = instr
        self.errstr = errstr
    def __enter__(self):
        print("ENTERING filter")
        return self
    def __exit__(self, a, b, c):
        print("EXITING filter")
        self.instr.close()
        self.errstr.close()
        return False
    def __next__(self):
        line = next(self.instr)
        while True:
            try:
                t = line.decode('utf8')
                return line.strip()
            except UnicodeDecodeError:
                self.errstr.write(line)
                line = next(self.instr)
        return line
    def __iter__(self):
        return self
    def next(self):
        return self.__next__()

然后,您可以这样使用它(假设Python2.7),在err.txt中获取所有违规行:

代码语言:javascript
复制
with open('file.csv') as istream, open("err.txt", 'w') as err, MyFilter(istream, err) as fd:
    c = csv.reader(fd)
    for i in c:
        # do you stuff, eg: print i

如果使用Python3,则可以使用几乎相同的筛选器类,只需将行return line.strip()替换为return t.strip(),以便返回字符串而不是字节。

用法也几乎相同:

代码语言:javascript
复制
with open('file.csv', 'rb') as istream, open("err.txt", 'wb') as err, MyFilter(istream, err) as fd:
    c = csv.reader(fd)
    for i in c:
        # do you stuff, eg: print (i)

根据您的注释,您还希望筛选包含空字符的行。这只需要在过滤器中稍加修改,while块就会变成(Python3版本):

代码语言:javascript
复制
    while True:
        if b'\x00' not in line:
            try:
                t = line.decode('utf8')
                return t.strip()
            except UnicodeDecodeError:
                pass
        self.errstr.write(line)
        line = next(self.instr)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30263434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档