使用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




