Python numpy genfromtext或numpy loadtxt“;ValueError:无法将字符串转换为浮点值;或;值太多,无法解压缩";,几乎什么都试过了

Python numpy genfromtext或numpy loadtxt“;ValueError:无法将字符串转换为浮点值;或;值太多,无法解压缩";,几乎什么都试过了,python,csv,numpy,Python,Csv,Numpy,我有一个非常令人沮丧的问题要解决好几个小时了。我在谷歌上用相关的问题和答案列出了所有的话题 我想做的是: 我有大量的测光数据集(CSV中有50-70k列),我想加载这些数据,然后将它们作为浮点数使用,并最终通过一些配件和计算绘制它们 数据示例如下: Time(s),AnalogIn-1,AnalogIn-2 0.00E+00,3.96E-02,3.33E-02 0.00E+00,4.10E-02,3.33E-02 因此,每列都有许多带有科学符号的数字 在我的代码中,我首先使用以下命令加载文本:

我有一个非常令人沮丧的问题要解决好几个小时了。我在谷歌上用相关的问题和答案列出了所有的话题

我想做的是: 我有大量的测光数据集(CSV中有50-70k列),我想加载这些数据,然后将它们作为浮点数使用,并最终通过一些配件和计算绘制它们

数据示例如下:

Time(s),AnalogIn-1,AnalogIn-2
0.00E+00,3.96E-02,3.33E-02
0.00E+00,4.10E-02,3.33E-02
因此,每列都有许多带有科学符号的数字

在我的代码中,我首先使用以下命令加载文本:

time, dat1, dat2= np.loadtxt(path, skiprows=1, unpack=True, delimiter=",")
它一直在删除“ValueError:无法将字符串转换为浮点值:”

如果我使用Excel,将整个CSV表从“常规”转换为“数字”,效果会很好


我尝试了这里讨论的所有内容,首先跳过标题和第一行,使用
np.loadtxt
np.genfromtxt
或pandas loader。还试图更改数据类型,修复转换器,重新映射加载到浮点的内容。这很有帮助,但只适用于某些行,并且错误很快会在随机行中弹出,或者弹出“太多值无法解包”我也试着跳过空白。我怀疑在转换过程中仍然存在问题,科学符号确实是一个字符串,它有“随机”顺序的“E”+“和“-”字符。我仍然认为我缺少了一些非常简单的解决方案,因为我的CSV实际上是标准数据。

使用您的示例
loadtxt
效果很好:

In [142]: np.loadtxt(txt.splitlines(), delimiter=',',skiprows=1)
Out[142]: 
array([[ 0.    ,  0.0396,  0.0333],
       [ 0.    ,  0.041 ,  0.0333]])
In [143]: time,dat1,dat2=np.loadtxt(txt.splitlines(), delimiter=',',skiprows=1,
     ...: unpack=True)
In [144]: time,dat1,dat2
Out[144]: (array([ 0.,  0.]), array([ 0.0396,  0.041 ]), array([ 0.0333,  0.0333]))
现在,如果我将其中一个txt行更改为:

0.00E+00,3.96E-02,3.33E+-02
我遇到了一个像你这样的错误:

In [146]: np.loadtxt(txt.splitlines(), delimiter=',',skiprows=1)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-146-ff3d27e104fc> in <module>()
----> 1 np.loadtxt(txt.splitlines(), delimiter=',',skiprows=1)

/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py in loadtxt(fname, dtype, comments, delimiter, converters, skiprows, usecols, unpack, ndmin)
   1022 
   1023             # Convert each value according to its column and store
-> 1024             items = [conv(val) for (conv, val) in zip(converters, vals)]
   1025             # Then pack it according to the dtype's nesting
   1026             items = pack_items(items, packing)

/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py in <listcomp>(.0)
   1022 
   1023             # Convert each value according to its column and store
-> 1024             items = [conv(val) for (conv, val) in zip(converters, vals)]
   1025             # Then pack it according to the dtype's nesting
   1026             items = pack_items(items, packing)

/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py in floatconv(x)
    723         if b'0x' in x:
    724             return float.fromhex(asstr(x))
--> 725         return float(x)
    726 
    727     typ = dtype.type

ValueError: could not convert string to float: b'3.33E+-02

“要解包的值太多”-我不喜欢使用
unpack
,除非我确实知道文件中的列数(甚至可能不知道)


这真的只是一个很长的评论,但如果它发现了问题,它可能是一个答案

使用您在评论中链接的CSV文件,我运行

time, dat1, dat2 = np.loadtxt("data1.csv", skiprows=1, unpack=True, delimiter=",")
而且它没有错误

当我检查文件时,我注意到行尾是一个单回车字符(通常缩写为CR,十六进制代码
0d
)。您提到使用Excel,所以我假设您使用的是Windows。在Windows中,通常以CR+LF结尾的行(两个字符:回车符后跟换行符;十六进制
0d0a

这可能就是问题所在(但我希望Python文件I/O能够解决这个问题)。我没有Windows系统来测试这个,所以目前我只能说“试试这个”:


当您的数据由空格分隔时,为什么要说
delimiter=“,”
?不过,小数分隔符的逗号会成为一个问题。感谢您的注意!我刚刚更正了帖子,格式不好。它确实是“,”分隔符和十进制分隔符是点。在编辑的数据中没有逗号。你为什么说它是逗号分隔的?你能提供到csv的链接吗?谢谢你,沃伦!这实际上与指定usecols[0,1,2]一起工作。是的,它在Windows PC上
In [169]: a1,a2 = np.loadtxt(txt.splitlines(), delimiter=',',skiprows=1,unpack=
     ...: True)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-169-4dea7c2876c1> in <module>()
----> 1 a1,a2 = np.loadtxt(txt.splitlines(), delimiter=',',skiprows=1,unpack=True)

ValueError: too many values to unpack (expected 2)
In [170]: a1,a2 = np.loadtxt(txt.splitlines(), delimiter=',',skiprows=1,unpack=
     ...: True, usecols=[1,2])
time, dat1, dat2 = np.loadtxt("data1.csv", skiprows=1, unpack=True, delimiter=",")
with open('data1.csv', 'r', newline='\r') as f:
    time, dat1, dat2 = np.loadtxt(f, skiprows=1, unpack=True, delimiter=",")