Python3中如何将rb模式读取的CSV转换为字符串型列表列表?
解决Python3中二进制读取CSV转字符串列表列表的问题
我之前处理过类似的场景,给你分享两种靠谱的实现方式——核心思路是先把二进制字节转成文本字符串,再用Python标准库的csv模块来解析(千万别自己手动用split(',')处理,不然会踩CSV格式的各种坑,比如引号包裹的逗号、字段内换行符这些)。
场景1:已经读取了整个文件的二进制内容
如果你已经通过file_obj.read()拿到了字节对象(比如csv_bytes = file_obj.read()),可以按以下步骤处理:
- 把字节解码为字符串:需要指定文件的实际编码(常见的是
utf-8,Windows生成的CSV可能是gbk或utf-8-sig) - 用
io.StringIO把字符串包装成类文件对象:因为csv.reader需要从文本流读取内容 - 用
csv.reader解析并转成列表列表
代码示例:
import csv import io # 假设你已经从rb模式文件中读取到二进制内容 csv_bytes = b'name,age\r\nAlice,25\r\nBob,30' # 解码为字符串,替换成你文件的真实编码 csv_str = csv_bytes.decode('utf-8') # 包装成文本流并解析 with io.StringIO(csv_str) as text_stream: csv_reader = csv.reader(text_stream) # 转成字符串型的列表列表 result = list(csv_reader) print(result) # 输出:[['name', 'age'], ['Alice', '25'], ['Bob', '30']]
场景2:文件对象还未关闭(可重置读取位置)
如果你的二进制文件对象还没关闭,只是之前读过了,可以先把文件指针移到开头,再用codecs模块直接把字节流转成文本流,省去手动解码的步骤:
代码示例:
import csv import codecs # 假设file_obj是用rb模式打开的文件对象 file_obj.seek(0) # 重置文件指针到开头,因为之前已经读过了 # 用codecs把字节流包装成指定编码的文本流 with codecs.getreader('utf-8')(file_obj) as text_file: csv_reader = csv.reader(text_file) result = list(csv_reader) print(result)
关键注意点
- 编码一定要匹配:如果解码时用错了编码,会出现乱码或者
UnicodeDecodeError,可以用chardet库检测文件编码(比如chardet.detect(csv_bytes)) - 优先用
csv模块解析:CSV格式支持字段内包含逗号、换行符(用引号包裹),csv.reader会自动处理这些特殊情况,手动拆分很容易出错
内容的提问来源于stack exchange,提问作者user1189851
相关产品推荐
相关产品推荐

