如何用np.genfromtxt()正确读取含引号内逗号的CSV并转换数据类型?
解决np.genfromtxt读取带引号含逗号CSV的问题
原代码的问题在于np.genfromtxt的delimiter=','会直接按逗号拆分所有内容,无法识别双引号包裹的含分隔符字段,导致"1,000"被拆分为两个字段。结合Python标准库的csv模块可以完美解决这个问题,同时完成数值转换,具体实现如下:
固定列数的解决方案
适用于已知CSV结构(如示例中的3列)的场景:
import numpy as np import csv def csv_opener(path): processed_data = [] with open(path, 'r', newline='', encoding='utf-8') as csv_file: # csv.reader原生支持解析带引号的含分隔符字段 csv_reader = csv.reader(csv_file) # 跳过表头(如果不需要表头可省略) next(csv_reader) for row in csv_reader: # 拆分字段,处理Price列:移除逗号后转整数 item, color, price_str = row price = int(price_str.replace(',', '')) processed_data.append([item, color, price]) # 转换为numpy结构化数组,指定各字段类型 return np.array(processed_data, dtype=[('Item', 'U10'), ('Color', 'U10'), ('Price', int)])
使用示例
调用函数后可直接获取结构化数组,方便提取特定字段:
csv_data = csv_opener('your_file.csv') print(csv_data) # 输出:[('iPhone', 'Red', 1000) ('Galaxy', 'Black', 1100)] # 提取Price列的数值 print(csv_data['Price']) # 输出:[1000 1100]
通用化解决方案
如果CSV的列位置不固定(比如Price列可能在任意位置),可以通过表头自动定位目标列:
import numpy as np import csv def csv_opener(path): processed_data = [] with open(path, 'r', newline='', encoding='utf-8') as csv_file: csv_reader = csv.reader(csv_file) headers = next(csv_reader) # 自动找到Price列的索引 price_col_idx = headers.index('Price') for row in csv_reader: # 处理目标列的数值转换 row[price_col_idx] = int(row[price_col_idx].replace(',', '')) processed_data.append(row) # 返回兼容多类型的numpy数组,或按需指定dtype return np.array(processed_data, dtype=object)
核心逻辑说明
- 字段解析:
csv.reader遵循RFC4180标准,会自动将双引号包裹的含逗号内容识别为单个字段,避免拆分错误。 - 数值转换:通过
replace(',', '')移除Price字段中的千位分隔符,再转换为整数(需浮点数则用float())。 - numpy集成:将处理后的列表转换为numpy数组,结构化数组类型可明确各字段的数据类型,便于后续数值计算。
内容的提问来源于stack exchange,提问作者Irohas
相关产品推荐
相关产品推荐

