在经过验证的索引上出现Python“列表索引超出范围”错误

时间:2018-07-10 05:53:27

标签: python-3.x

首先,我想创建一个函数来读取文件夹中的每个文件,删除扩展名,将它们附加到一个空列表中并打印前十个条目。

def directory_contents(directory):

    import os

    dl = os.listdir(directory)

    files = []

    for file in dl:
        filename = os.path.splitext(file)

        files.append(filename[0])

    print(files[:10])

接下来,我将每个文件名分成几个单独的部分,并将它们放入单独的列表中。我将遍历每个文件,并将文件名的每个部分附加到适当的列表中。最后,我将合并每个列表以创建一个DataFrame /表。

def split_filename(directory):
    import os

    dl = os.listdir(directory)

    Index_0 = []
    Index_1 = []
    Index_2 = []
    Index_3 = []
    Index_4 = []

    for file in dl:
        filename = os.path.splitext(file)
        no_ext = filename[0].split('_')
        i_0 = no_ext[0]
        i_1 = no_ext[1]
        i_2 = no_ext[2]
        i_3 = no_ext[3]
        i_4 = no_ext[4]

        Index_0.append(i_0)
        Index_1.append(i_1)
        Index_2.append(i_2)
        Index_3.append(i_3)
        Index_4.append(i_4)

    print(Index_0[:10])
    print(Index_1[:10])
    print(Index_2[:10])
    print(Index_3[:10])
    print(Index_4[:10])

如您在上面的函数中看到的,我创建了一个空列表来保存文件名的每个部分,然后按其索引进行拆分。前循环循环访问目录(dl)中的每个文件,并使用splittext()方法删除文件扩展名。然后,我使用创建的第一个索引,但使用splitext,因为它包含我要再次拆分以访问每个部分的信息。然后,带有下划线的split()方法将文件名分成单独的部分,并另存为单独的变量。接下来,我们将每个变量附加到适当的列表中,并在完成所有操作后打印该列表。

让我们定义目录,看看函数的输出是什么。

directory = './Test/Data/'
directory_contents(directory)

输出: [ 'f0_f1_f2_f3_f4', 'd0_d1_d2_d3_d4', 'i0_i1_i2_i3_i4', 'j0_j1_j2_j3_j4', 'b0_b1_b2_b3_b4', 'e0_d1_d2_d3_d4', 'g0_g1_g2_g3_g4', 'h0_h1_h2_h3_h4', 'a0_a1_a2_a3_a4', 'c0_c1_c2_c3_c4']

那很好。现在,让我们看看它是否可以在包含我要分析的文件的文件夹中工作。

directory = './WBV/database/WBV/cmj/pre/0 Hz/'
directory_contents(directory)

输出: [ 'P05_0Hz_Pre_CMJ_T02', 'P24_0Hz_Pre_CMJ_T03', 'P17_0Hz_Pre_CMJ_T01', 'P19_0Hz_Pre_CMJ_T01', 'P14_0Hz_Pre_CMJ_T02', 'P13_0Hz_Pre_CMJ_T02', 'P02_0Hz_Pre_CMJ_T01', 'P26_0Hz_Pre_CMJ_T01', 'P14_0Hz_Pre_CMJ_T01', 'P06_0Hz_Pre_CMJ_T02']

那很好,它读取文件夹中的所有文件,而不是按数字顺序。让我们看看它是否可以拆分所有文件名。

split_filename(directory)

输出:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-22-392a30f7485a> in <module>()
----> 1 split_filename(directory)

<ipython-input-17-d53a23fcf079> in split_filename(directory)
     15         i_0 = no_ext[0]
     16         i_1 = no_ext[1]
---> 17         i_2 = no_ext[2]
     18         i_3 = no_ext[3]
     19         i_4 = no_ext[4]

IndexError: list index out of range

在这里事情不再有意义。当文本文件夹和研究文件夹中的文件名具有相同格式时,为什么会引发索引错误?让另一个函数列出一个文件名各部分的索引。

import os
fn = os.path.splitext('./WBV/database/WBV/cmj/pre/0 Hz/P05_0Hz_Pre_CMJ_T02.exp')
f0 = fn[0].split('_')
for i in f0:
    print(f0.index(i), i)

输出: 0 ./WBV/数据库/ WBV / cmj / pre / 0 Hz / P05 1 0Hz 2前 3厘米 4 T02

除了文件路径是第一个索引的一部分外,它还指出“ Pre”位于索引2。那么为什么在调用索引2时为什么抛出错误?任何有关如何解决此错误的建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

您的代码对我来说似乎是正确的。

我建议更改directory_contents函数以显示所有内容,而不仅显示前十个内容,因此您可以检查隐藏文件。如果您使用的是Windows,则文件夹中可能会包含一些隐藏的desktop.ini,这些文件将列在os.listdir()中。当然,这不能与您的程序配合使用...

如果这没有帮助,请在您的for循环中添加一个print(no_ext),以查看实际导致该错误的文件名。 (您的打印功能位于代码的最后,因此错误可以出现在列表中的任何位置,而不必在第一个条目上显示!)