Python如何将CSV存储的zip列表还原为原始4个独立列表
问题核心说明
你当前的写入代码存在逻辑偏差,会导致存储的CSV格式不符合常规表格结构,先修正写入逻辑,再实现读取还原即可完全匹配你最初的四个独立列表结构。
原有写入代码的问题
你通过zip(buycoin, buyprice, buyqty, buystatus)生成的buyall是二维结构:每个元素对应一条完整的交易记录,包含4个字段值。但你现在调用wr.writerow(buyall),会把所有交易记录打包成1行写入文件,而非按“每行一条交易”的CSV标准格式存储,这是后续难以拆分还原的核心原因。
修正后的写入参考代码
import csv def save_csv(buycoin, buyprice, buyqty, buystatus): buyall = list(zip(buycoin, buyprice, buyqty, buystatus)) # 补充newline参数避免Windows下出现空行,指定utf-8编码避免中文乱码 with open('Trade Data.csv', 'wt', newline='', encoding='utf-8') as myfile: wr = csv.writer(myfile, quoting=csv.QUOTE_ALL) # 可选写入表头,方便后续打开文件时识别列含义 wr.writerow(['coin', 'price', 'qty', 'status']) # 用writerows逐行写入所有交易记录 wr.writerows(buyall)
读取还原4个独立列表的实现
核心逻辑是先逐行读取CSV的二维数据结构,再通过转置操作将每一列的内容还原为独立列表,完全匹配你当初用zip打包前的结构:
import csv def load_csv(): rows = [] with open('Trade Data.csv', 'rt', encoding='utf-8') as myfile: reader = csv.reader(myfile) # 跳过写入时存的表头,若未写表头则删除这行代码 next(reader) # 逐行读取所有交易记录 for row in reader: rows.append(row) # 转置二维结构,拆分为4个独立列,这是当初zip打包操作的逆过程 buycoin, buyprice, buyqty, buystatus = zip(*rows) # zip解包后返回的是元组,转换为和原结构一致的列表类型 buycoin = list(buycoin) buyprice = list(buyprice) buyqty = list(buyqty) buystatus = list(buystatus) return buycoin, buyprice, buyqty, buystatus
关键注意事项
- CSV读取的所有内容默认是字符串类型,如果原始的价格、数量是数值类型,需要手动做类型转换,否则后续计算会出现类型错误,示例转换代码:
# 按原始数据类型转换 buyprice = [float(p) for p in buyprice] buyqty = [float(q) for q in buyqty] - 如果写入时没有存表头,读取时需要删掉
next(reader)的跳行代码
特殊情况适配(已按错误格式存了文件)
如果你已经用最初的错误代码生成了CSV文件,无法重新写入,可通过如下代码直接还原:
import csv import ast def load_legacy_csv(): with open('Trade Data.csv', 'rt', encoding='utf-8') as myfile: reader = csv.reader(myfile) # 读取错误格式下存的单行内容,每个元素是字符串格式的交易元组 raw_row = next(reader) # 将字符串格式的元组转换为实际的列表结构 rows = [ast.literal_eval(item) for item in raw_row] # 转置拆分得到4个独立列表 buycoin, buyprice, buyqty, buystatus = [list(col) for col in zip(*rows)] return buycoin, buyprice, buyqty, buystatus
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

