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)
遇到两个问题:
- 尝试用
data_Sevol[1][1]下标访问时,报错TypeError: '_csv.reader' object is not subscriptable - 读取的元素为字符串格式,需要转为数字;纠结修改保存方式还是读取方式更合适
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
相关产品推荐
相关产品推荐

