如何从csv读取字节对象?

时间:2017-12-10 17:03:18

标签: python python-3.x

我使用tweepy将推文文本存储在csv文件中使用Python csv.writer(),但我必须在存储之前用utf-8编码文本,否则tweepy会抛出一个奇怪的错误。

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

"b'Lorem Ipsum\xc2\xa0Assignment '"

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

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])'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

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

3 个答案:

答案 0 :(得分:3)

如果您的输入文件确实包含带有Python语法b前缀的字符串,那么解决它的一种方法(即使它不是真正有效的csv数据格式)将使用Python的{{3函数@Ryan提到虽然我会以稍微不同的方式使用它,如下所示。

这将提供一种安全的方法来解析文件中添加了b'字节字符串前缀的任何字符串。其余的字段将保持不变。

import ast
import csv


def _parse_bytes(field):
    """ Convert string represented in Python byte-string literal syntax into a
    decoded character string. Other field types returned unchanged.
    """
    result = field
    try:
        result = ast.literal_eval(field)
    finally:
        return result.decode() if isinstance(result, bytes) else field

def fix_bytes(filename, delimiter=','):
    with open(filename, 'rt') as f:
        yield from (delimiter.join(_parse_bytes(field)
                                        for field in line.split(delimiter))
                                            for line in f)

filename = 'bytes_data.csv'
reader = csv.reader(fix_bytes(filename))
for row in reader:
    print(row[3])

答案 1 :(得分:2)

最简单的方法如下。试试看。

import csv
from io import StringIO

byte_content = b"iam byte content"
content = byte_content.decode()
file = StringIO(content)
csv_data = csv.reader(file, delimiter=",")

答案 2 :(得分:1)

您可以使用ast.literal_eval安全地将不正确的字段转换回字节:

$loader = new Loader();
$loader->registerFiles('../vendor/autoload.php');