首页 > 解决方案 > CSV 阅读器无法读取正确的列

问题描述

我再次抱歉。所以这是我试图读取的数据的一个例子。

nhy, time, dt=    0  0.0000D+00  1.9416D-02
nhy, time, dt=    1  1.9400D-02  2.2416D-02
nhy, time, dt=    2  4.3800D-02  3.0416D-02
nhy, time, dt=    3  7.3540D-02  4.8416D-02
nhy, time, dt=    4  1.3350D-01  6.9416D-02

我正在尝试使用此代码提取 dt 列,

dt50 = []

file = "timestep.log"
col_list = ["dt"]
data = pd.read_csv(file, sep= '\s+|\t+|\s+\t+|\t+\s', skiprows = (30), usecols = col_list

dt50.extend(data['dt'])

print(dt50)

这一切都只返回 dt 列而不是实际值列。我猜这与我声明我想要的列有关,但不确定我哪里出错了。

对不起,因为我缺乏编码能力而打扰大家。

标签: python-3.xpandascsv

解决方案


您只是进入dt输出,因为它将第一行数据解释为列。因此,输出数据如下所示:

   nhy, time, dt =   0  0.0000D+00  1.9416D-02
0  nhy, time, dt =   1  1.9416D-02  2.4464D-02
1  nhy, time, dt =   2  4.3881D-02  3.0825D-02
2  nhy, time, dt =   3  7.4706D-02  3.8840D-02
3  nhy, time, dt =   4  1.1355D-01  4.8938D-02
4  nhy, time, dt =   5  1.6248D-01  6.1662D-02
5  nhy, time, dt =   6  2.2415D-01  7.7694D-02
6  nhy, time, dt =   7  3.0184D-01  9.7895D-02
7  nhy, time, dt =   8  3.9974D-01  1.2335D-01
8  nhy, time, dt =   9  5.2308D-01  1.5542D-01
9  nhy, time, dt =  10  6.7850D-01  1.9583D-01

如您所见,这些列是:nhy,, time,, dt, =, 0, 0.0000D+00, 1.9416D-02. 因此,当您尝试通过说 访问这些值时data["dt"],位于该列下的唯一数据"dt"就是 的其他字符串值"dt"

这里的问题是您的正则表达式模式。您当前的正则表达式模式检查它具有任意数量的空格和/或制表符的实例。因为nhy, time, dt =都由空格和/或制表符分隔,所以它将为每个由空格分隔的元素创建列。让我们用 替换这个正则表达式\s{2,},它将检查两个或多个空格(实际值都被两个空格唯一分隔)。然后,我们可以用 为列分配自己的名称names=["nhy", "time", "dt"]。然后,您的read_csv行将如下所示:

file = "timestep.log"
data = pd.read_csv(file, sep="\s{2,}", names=["nhy", "time", "dt"])

这给了我们:

                 nhy        time          dt
nhy, time, dt =    0  0.0000D+00  1.9416D-02
nhy, time, dt =    1  1.9416D-02  2.4464D-02
nhy, time, dt =    2  4.3881D-02  3.0825D-02
nhy, time, dt =    3  7.4706D-02  3.8840D-02
nhy, time, dt =    4  1.1355D-01  4.8938D-02
nhy, time, dt =    5  1.6248D-01  6.1662D-02
nhy, time, dt =    6  2.2415D-01  7.7694D-02
nhy, time, dt =    7  3.0184D-01  9.7895D-02
nhy, time, dt =    8  3.9974D-01  1.2335D-01
nhy, time, dt =    9  5.2308D-01  1.5542D-01

现在我们在各自的列中拥有所有数据。我们所要做的就是重置索引,目前是nhy, time, dt =

data.reset_index(drop=True, inplace=True)

这给了我们:

    nhy        time          dt
0     0  0.0000D+00  1.9416D-02
1     1  1.9416D-02  2.4464D-02
2     2  4.3881D-02  3.0825D-02
3     3  7.4706D-02  3.8840D-02
4     4  1.1355D-01  4.8938D-02
5     5  1.6248D-01  6.1662D-02
6     6  2.2415D-01  7.7694D-02
7     7  3.0184D-01  9.7895D-02
8     8  3.9974D-01  1.2335D-01
9     9  5.2308D-01  1.5542D-01

现在剩下要做的就是扩展您现有的列表:

dt50.extend(data["dt"].tolist())

这给了我们想要的输出:

['1.9416D-02', '2.4464D-02', '3.0825D-02', '3.8840D-02', '4.8938D-02', '6.1662D-02', '7.7694D-02', '9.7895D-02', '1.2335D-01', '1.5542D-01']

推荐阅读