如何从csv读取字节对象?

发布于 2021-01-29 16:20:06

我已经使用tweepy使用Python来将tweet的文本存储在csv文件中csv.writer(,但是在存储之前我不得不在utf-8中对文本进行编码,否则tweepy会抛出一个奇怪的错误。

现在,文本数据存储如下:

"b'Lorem Ipsum\xc2\xa0Assignment '"

我尝试使用以下代码对此进行解码(其他列中有更多数据,文本位于第三列中):

with open('data.csv','rt',encoding='utf-8') as f:
    reader = csv.reader(f,delimiter=',')
    for row in reader:
        print(row[3])

但是,它不会解码文本。我无法使用,.decode('utf-8')因为csv阅读器将数据读取为字符串,即type(row[3])is,'str'而且我似乎无法将其转换为bytes,数据再次被编码!

如何解码文本数据?

编辑:这是来自csv文件的示例行:

67783591545656656999,3415844,1450443669.0,b'Virginia School District Closes After Backlash Over Arabic Assignment: The Augusta County school district in\xe2\x80\xa6  | @abcde',52,18

注意:如果解决方案处于编码过程中,请注意,我无力再次下载整个数据。

关注者
0
被浏览
283
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果您的输入文件中确实包含带有Python语法b前缀的字符串,则解决该问题的一种方法(即使它并不是包含csv数据的真正有效格式)也可以使用ast.literal_eval提到的Python函数@Ryan,尽管我会在方式略有不同,如下所示。

    这将提供一种安全的方法来解析文件中以前缀b指示为字节字符串的字符串。其余的将不变地传递。

    import ast
    import csv
    
    
    def _parse_bytes(field):
        """ Convert string represented in Python byte-string literal b'' syntax into
            a decoded character string - otherwise return it unchanged.
        """
        result = field
        try:
            result = ast.literal_eval(field)
        finally:
            return result.decode() if isinstance(result, bytes) else field
    
    
    def my_csv_reader(filename, /, **kwargs):
        with open(filename, 'rt', newline='') as file:
            for row in csv.reader(file, **kwargs):
                yield [_parse_bytes(field) for field in row]
    
    
    reader = my_csv_reader('bytes_data.csv', delimiter=','):
    for row in reader:
        print(row)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看