使用numpy genfromtxt导入含特殊字符CSV的字符串读取问题
解决np.genfromtxt导入含特殊字符的CSV时字符串显示为UTF-8编码的问题
这个问题我之前也碰到过!其实是因为np.genfromtxt在Python3下默认用str dtype时会返回字节数组(bytes),而不是我们想要的Unicode字符串,所以像除法符号这类特殊字符才会显示成\xc3\xb7这种UTF-8字节编码形式。下面给你两种直接可行的解决办法:
方法一:导入时直接指定Unicode字符串类型和编码
在调用np.genfromtxt时,把dtype设为Unicode字符串格式(比如'U20',数字代表字符串最大长度,根据你的实际表达式长度调整),同时指定encoding='utf-8'参数,就能直接得到可读的字符串:
假设你的CSV文件expressions.csv内容如下:
id,expression 1,(10/2) 2,(15-3*4) 3,(7+2.5)
对应的代码:
import numpy as np # 导入时指定Unicode dtype和编码 data = np.genfromtxt( 'expressions.csv', delimiter=',', dtype='U50', # U表示Unicode,50是足够容纳表达式的长度 skip_header=1, # 跳过表头行 encoding='utf-8' ) print(data) # 输出:[['1' '(10/2)'] ['2' '(15-3*4)'] ['3' '(7+2.5)']]
方法二:对已导入的字节数组进行转换
如果已经用默认方式导入得到了字节数组,可以通过astype方法直接转换为Unicode字符串:
# 假设已经导入了字节类型的数组 data_bytes = np.genfromtxt('expressions.csv', delimiter=',', dtype=str, skip_header=1) # 转换为Unicode字符串 data_str = data_bytes.astype('U50') print(data_str) # 同样会输出可读的表达式字符串
关键原因说明
在Python3中,numpy的str dtype对应的是字节数组(bytes类型),而不是Python的原生字符串(str类型)。当CSV中包含UTF-8编码的特殊字符时,字节数组会显示为转义后的十六进制形式(比如/的UTF-8编码是\xc3\xb7)。而指定U开头的dtype(如U50)会告诉numpy直接生成Unicode字符串,配合encoding='utf-8'就能正确解析特殊字符。
内容的提问来源于stack exchange,提问作者user330860
相关产品推荐
相关产品推荐

