【问题标题】:Read in csv file with one column of strings in the middle读取 csv 文件,中间有一列字符串
【发布时间】:2014-01-09 23:45:10
【问题描述】:

我有一个标准格式的 csv 输入文件,其中包含我要剥离的凌乱标题,然后是一个 35 列和 8760 行的数组。所有这些数据都是数字,除了第 6 列是文本。我曾尝试让genfromtxt() 自行解决这个问题,但最后该列转向nans,我相信是因为没有引号。

目前,我正在读取这个数组如下:

WeaData = np.genfromtxt(FileIn, delimiter=",", skip_header=8)

我尝试过手动指定列类型

WeaData = np.genfromtxt(FileIn, delimiter=",", skip_header=8, dtype=(float,float,float,float,float,str,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float))

WeaData = np.genfromtxt(FileIn, delimiter=",", skip_header=8, dtype=[float for n in range(5)]+['S10']+[float for n in range(29)])

但没有运气。我相信我的语法在第一个选项中是错误的,第二个返回一个空数组。有没有一种简单的方法可以做到这一点,最好不指定 35 列类型?

这是我的csv文件的三行供参考,在我不关心的标题之后。

1966,1,1,1,60,A7A7A7A7*0?0?0?0?0?0?0?0A7A7A7A7A7A7F8F8A7E7,3.9,1.7,86,102400,0,0,264,0,0,0,0,0,0,0,230,2.1,0,0,24.1,77777,0,999999999,8,0.1000,0,88,0.000,0.0,0.0
1966,1,1,2,60,A7A7A7A7*0?0?0?0?0?0?0?0A7A7A7A7A7A7F8F8A7E7,4.4,0.0,73,102500,0,0,265,0,0,0,0,0,0,0,270,3.6,0,0,24.1,77777,0,999999999,8,0.1000,0,88,0.000,0.0,0.0
1966,1,1,3,60,A7A7A7A7*0?0?0?0?0?0?0?0A7A7A7A7A7A7F8F8A7E7,2.8,-0.6,79,102500,0,0,258,0,0,0,0,0,0,0,310,2.1,0,0,24.1,77777,0,999999999,8,0.1000,0,88,0.000,0.0,0.0

我正在使用 Python V2.7。

【问题讨论】:

  • 嗨,有很多方法可以读取 csv,你应该看看这个question
  • 是否有理由需要将其直接读入 numpy 数组?你应该看看pandas
  • 使用仅包含您显示的三行的数据文件,您的第二个示例对我有用。我将 'S10' 更改为 'S32' 以确保文本字段没有被截断,并且我没有使用 skip_header 参数,因为我没有添加标题。当您指定这样的 dtype 时,该函数会返回一个结构化数组 (docs.scipy.org/doc/numpy/user/basics.rec.html)。这就是你得到的吗?

标签: python python-2.7 csv numpy


【解决方案1】:

使用numpy.loadtxt 和参数usecols 仅选择包含浮点数的列。

>>> import numpy as np
>>> cols = range(0,5) + range(6,35)
>>> data = np.loadtxt("data.txt", delimiter=",", usecols=cols, dtype=np.float)
>>> data
[[  1.96600000e+03   1.00000000e+00   1.00000000e+00   1.00000000e+00
    6.00000000e+01   3.90000000e+00   1.70000000e+00   8.60000000e+01
    1.02400000e+05   0.00000000e+00   0.00000000e+00   2.64000000e+02
    0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00
    0.00000000e+00   0.00000000e+00   0.00000000e+00   2.30000000e+02
    2.10000000e+00   0.00000000e+00   0.00000000e+00   2.41000000e+01
    7.77770000e+04   0.00000000e+00   9.99999999e+08   8.00000000e+00
    1.00000000e-01   0.00000000e+00   8.80000000e+01   0.00000000e+00
    0.00000000e+00   0.00000000e+00]
 [  1.96600000e+03   1.00000000e+00   1.00000000e+00   2.00000000e+00
    6.00000000e+01   4.40000000e+00   0.00000000e+00   7.30000000e+01
    1.02500000e+05   0.00000000e+00   0.00000000e+00   2.65000000e+02
    0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00
    0.00000000e+00   0.00000000e+00   0.00000000e+00   2.70000000e+02
    3.60000000e+00   0.00000000e+00   0.00000000e+00   2.41000000e+01
    7.77770000e+04   0.00000000e+00   9.99999999e+08   8.00000000e+00
    1.00000000e-01   0.00000000e+00   8.80000000e+01   0.00000000e+00
    0.00000000e+00   0.00000000e+00]
 [  1.96600000e+03   1.00000000e+00   1.00000000e+00   3.00000000e+00
    6.00000000e+01   2.80000000e+00  -6.00000000e-01   7.90000000e+01
    1.02500000e+05   0.00000000e+00   0.00000000e+00   2.58000000e+02
    0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00
    0.00000000e+00   0.00000000e+00   0.00000000e+00   3.10000000e+02
    2.10000000e+00   0.00000000e+00   0.00000000e+00   2.41000000e+01
    7.77770000e+04   0.00000000e+00   9.99999999e+08   8.00000000e+00
    1.00000000e-01   0.00000000e+00   8.80000000e+01   0.00000000e+00
    0.00000000e+00   0.00000000e+00]]

如果要包含第 6 列,则必须将矩阵作为对象加载,不能将浮点数与字符串混合。

>>> data = np.loadtxt("data.txt", delimiter=",", dtype=np.object)

因此,如果您需要此列,请单独加载。

【讨论】:

  • 谢谢,这行得通。有点新但持续的问题 - 然后我需要能够将所有内容写回文本文件(以与我读取它的相同格式),但我有一些列作为数字类型,而那些作为字符串。 np.savetxt 抱怨,因为并非所有元素都是浮点数。将浮点数和字符串的 numpy 数组保存到文本文件的最佳做法是什么?是否有一种干净的直接方式,或者可能需要先将整个内容转换为字符串?
猜你喜欢
  • 2011-12-18
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 2013-10-31
  • 2017-04-23
  • 2019-08-14
  • 2014-12-04
相关资源
最近更新 更多