You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用numpy.genfromtxt转换CSV文件时,如何导入带引号的列并解决最后一列返回NaN的问题

解决带双引号CSV字段的转换问题

你的问题核心在于numpy.genfromtxt对标准CSV格式的支持不足——它没法正确解析被双引号包裹的字段(尤其是字段里包含逗号分隔符时),导致列数匹配混乱,最后一列自然被填充成NaN。下面给你两个实用的解决方案,都能完美处理带引号的字段,同时帮你把最后一列也导入进来:

方案1:用Python标准库csv模块(无需额外安装)

csv模块是Python原生专门处理CSV的工具,天生支持RFC4180标准格式(就是带双引号的那种),修改后的代码如下:

import csv
import os

# 配置输入输出路径
input_folder = r'Nuvole_split'
output_folder = r'D:\Tesi\VAIA_grosso\Nuvole_split\Conv'

# 确保输出文件夹存在,不存在就创建
os.makedirs(output_folder, exist_ok=True)

for i in range(1, 9226):
    csv_path = os.path.join(input_folder, f'Tri_{i}.csv')
    txt_path = os.path.join(output_folder, f'Nuvola{i}.txt')
    try:
        with open(csv_path, 'r', newline='', encoding='utf-8') as csv_file:
            # 创建CSV阅读器,自动识别双引号包裹的字段
            csv_reader = csv.reader(csv_file, quoting=csv.QUOTE_ALL)
            next(csv_reader)  # 跳过表头行
            
            # 收集需要的列:前3列 + 最后一列
            data_lines = []
            for row in csv_reader:
                if row:  # 跳过空行避免报错
                    selected_cols = [row[0], row[1], row[2], row[-1]]
                    data_lines.append(selected_cols)
            
            # 写入TXT文件,用空格分隔字段(你可以换成\t制表符或其他分隔符)
            with open(txt_path, 'w', encoding='utf-8') as txt_file:
                for line in data_lines:
                    txt_file.write(' '.join(line) + '\n')
    except Exception as e:
        print(f"处理Tri_{i}.csv时出错:{e}")

小说明:

  • quoting=csv.QUOTE_ALL参数会让阅读器自动忽略双引号包裹字段里的逗号,不会错误分割列
  • 如果不需要最后一列,删掉row[-1]即可
  • 写入TXT时的分隔符可以自己改,比如把' '.join(line)改成'\t'.join(line)用制表符分隔

方案2:用pandas(更简洁,适合数据处理场景)

如果你已经安装了pandas,那代码会更清爽——pandas.read_csv默认就能识别带双引号的字段,无需额外配置:

import pandas as pd
import os

input_folder = r'Nuvole_split'
output_folder = r'D:\Tesi\VAIA_grosso\Nuvole_split\Conv'
os.makedirs(output_folder, exist_ok=True)

for i in range(1, 9226):
    csv_path = os.path.join(input_folder, f'Tri_{i}.csv')
    txt_path = os.path.join(output_folder, f'Nuvola{i}.txt')
    try:
        # 读取CSV,跳过表头行
        df = pd.read_csv(csv_path, skiprows=1)
        # 选择前3列和最后一列
        selected_data = df[list(df.columns[:3]) + [df.columns[-1]]]
        # 保存为TXT,不写索引和表头,用空格分隔
        selected_data.to_csv(txt_path, sep=' ', index=False, header=False)
    except Exception as e:
        print(f"处理Tri_{i}.csv时出错:{e}")

小说明:

  • pandas会自动处理带引号的文本字段,不会把最后一列变成NaN
  • 如果不需要最后一列,只保留list(df.columns[:3])就行

为什么原来的numpy方案不行?

numpy.genfromtxt是为数值型数组设计的工具,对文本字段的兼容性很差。遇到带双引号的字段时,它会把引号当成字段内容的一部分,还会硬按逗号分割,导致列数乱掉;最后一列因为不符合数值类型的要求,就被填充成NaN了。

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

火山引擎 最新活动