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

如何用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)

核心逻辑说明

  1. 字段解析:csv.reader遵循RFC4180标准,会自动将双引号包裹的含逗号内容识别为单个字段,避免拆分错误。
  2. 数值转换:通过replace(',', '')移除Price字段中的千位分隔符,再转换为整数(需浮点数则用float())。
  3. numpy集成:将处理后的列表转换为numpy数组,结构化数组类型可明确各字段的数据类型,便于后续数值计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:17:34