You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python读取CSV无法下标访问元素,该改保存还是读取逻辑?

问题解决:CSV文件读写的下标访问与数据类型转换

问题背景

用户保存CSV的代码:

with open(path + '/data_Sevol.csv', 'w', newline='') as csvfile:
     fieldnames = ['Sevol']
     writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
     writer.writeheader()
     for i in range(len(Sevol)):
         writer.writerow({'Sevol': Sevol[i].tolist()})

读取CSV的代码:

directory = os.getcwd()
path = os.path.join(directory, name_folder)

with open(path + str("\\") + str("data_Sevol.csv"), 'r') as file:
    data_Sevol = csv.reader(file)
    for row in data_Sevol:
        print(row)

遇到两个问题:

  1. 尝试用data_Sevol[1][1]下标访问时,报错TypeError: '_csv.reader' object is not subscriptable
  2. 读取的元素为字符串格式,需要转为数字;纠结修改保存方式还是读取方式更合适

1. 解决下标访问报错

csv.reader返回的是迭代器对象,而非列表,因此无法直接通过下标访问。解决方法是将迭代器转换为列表:

directory = os.getcwd()
path = os.path.join(directory, name_folder)

with open(os.path.join(path, "data_Sevol.csv"), 'r') as file:
    reader = csv.reader(file)
    data_Sevol = list(reader)  # 转换为列表后即可用下标访问
    print(data_Sevol[0][0])  # 正常访问第一个数据行的第一个元素

另外建议用os.path.join(path, "data_Sevol.csv")拼接路径,避免手动处理斜杠的兼容性问题。

2. 数据类型转换与读写方式选择

核心结论:修改读取方式更合适

CSV本身是文本格式,无论保存时怎么处理,写入的内容本质都是字符串。因此在读取阶段转换类型是更灵活、通用的方案。

手动转换类型的读取代码

directory = os.getcwd()
path = os.path.join(directory, name_folder)

with open(os.path.join(path, "data_Sevol.csv"), 'r') as file:
    reader = csv.reader(file)
    next(reader)  # 跳过表头行
    data_Sevol = []
    for row in reader:
        # 根据实际数据类型选择float或int转换
        num_row = [float(cell) for cell in row]
        data_Sevol.append(num_row)
    # 此时data_Sevol中的元素均为数字类型
    print(type(data_Sevol[0][0]))  # 输出<class 'float'>

简化方案:用pandas读取

如果允许使用pandas,它会自动识别数字类型,同时支持更便捷的访问方式:

import pandas as pd
data_Sevol = pd.read_csv(os.path.join(path, "data_Sevol.csv"))
# 按列名+行号访问
print(data_Sevol['Sevol'][0])
print(type(data_Sevol['Sevol'][0]))

可选:优化保存代码(非必须)

如果想让CSV内容更简洁,若Sevol是numpy数组,可修改保存逻辑直接写入单个元素值:

with open(os.path.join(path, 'data_Sevol.csv'), 'w', newline='') as csvfile:
     fieldnames = ['Sevol']
     writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
     writer.writeheader()
     for item in Sevol:
         writer.writerow({'Sevol': item.item()})  # 取出numpy数组的单个元素值

但这仅优化了文件内容格式,核心的类型转换仍需在读取时处理。


内容的提问来源于stack exchange,提问作者User8563

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:30:51