List Python:从复杂目录树中的文件中提取浮动-循环就是答案吗?

List Python:从复杂目录树中的文件中提取浮动-循环就是答案吗?,list,python-2.7,loops,for-loop,directory,List,Python 2.7,Loops,For Loop,Directory,我刚刚开始做我的第一个研究项目,我刚刚开始编程(大约两周前)。如果我的问题很幼稚,请原谅。我可能使用python效率很低。我渴望在这里进步 我有实验数据要分析。我的目标是创建一个python脚本,该脚本将数据作为输入,而输出脚本为我提供图形,其中文本文件(在实验数据文件夹中)中包含的某些参数被绘制并拟合到特定的方程。这个脚本应该尽可能通用,这样我就可以将它用于其他实验 我正在使用Anaconda、Python2.7包,这意味着我可以访问与科学和数学相关的各种库/模块 我一直在尝试使用For和Wh

我刚刚开始做我的第一个研究项目,我刚刚开始编程(大约两周前)。如果我的问题很幼稚,请原谅。我可能使用python效率很低。我渴望在这里进步

我有实验数据要分析。我的目标是创建一个python脚本,该脚本将数据作为输入,而输出脚本为我提供图形,其中文本文件(在实验数据文件夹中)中包含的某些参数被绘制并拟合到特定的方程。这个脚本应该尽可能通用,这样我就可以将它用于其他实验

我正在使用Anaconda、Python2.7包,这意味着我可以访问与科学和数学相关的各种库/模块

我一直在尝试使用For和While循环(这是第一次)

数据文件的结构如下(我在这里使用regex括号):

我想做的是循环遍历所有7个顶级目录及其6个子目录(命名为1,2,3…6)。此外,在这6个子目录中,可以找到一个文本文件(始终使用相同的文件名text.txt),其中包含我想要访问的数据

“text.txt”文件的结构如下:

 1     91.146    4.571   0.064   1.393   939.134     14.765

 2     88.171    5.760   0.454   0.029   25227.999   137.883

 3     88.231    4.919   0.232   0.026   34994.013   247.058

 4      ...       ...     ...     ...      ...         ...
桌子继续往下走。每隔一行是空的。我想从第8行开始的13行中提取信息,我只对第2、第3和第5列感兴趣。我想把它们分别放在“parameter_a”和“parameter_b”以及“parameter_c”列表中。我想从每个“text.txt”文件(其中总共有7*6=42)中执行此操作,并将它们附加到三个大列表中(完成所有操作后,每个列表总共有7*6*13=546项)

这是我的尝试:

首先,我制作了一个列表“list_B_foo”,其中包含七个不同的“B_foo”目录(脚本的这部分未显示)。然后我做了这个:

parameter_a = []
parameter_b = []
parameter_c = []
j = 7 # The script starts reading 'text.txt' after the j:th line.
k = 35 # The script stops reading 'text.txt' after the k:th line.
x = 0
while x < 7:
    for i in range(1, 7):
        path = str(list_B_foo[x]) + '/%s/D_foo/E_foo/text.txt' % i
        m = open(path, 'r')
        line = m.readlines()
        while j < k:
            line = line[j]
            info = line.split()
            print 'info:', info
            parameter_a.append(float(info[1]))
            parameter_b.append(float(info[2]))
            parameter_c.append(float(info[5]))
            j = j + 2
    x = x + 1

parameter_a_vect = np.array(parameter_a)
parameter_b_vect = np.array(parameter_b)
parameter_c_vect = np.array(parameter_c)

print 'a_vect:', parameter_a_vect
print 'b_vect:', parameter_b_vect
print 'c_vect:', parameter_c_vect
参数_a=[]
参数_b=[]
参数_c=[]
j=7#脚本开始在j:th行后读取'text.txt'。
k=35#脚本在第k行之后停止读取“text.txt”。
x=0
当x<7时:
对于范围(1,7)内的i:
path=str(list_B_foo[x])+'/%s/D_foo/E_foo/text.txt“%i”
m=打开(路径“r”)
line=m.readlines()
而j
我曾尝试在缩进方面胡乱摆弄,但没有让它工作(收到语法错误或缩进错误)。目前,我得到以下输出:

info: ['1', '90.647', '4.349', '0.252', '0.033', '93067.188', '196.142']
info: ['.']
Traceback (most recent call last):
  File "script.py", line 104, in <module>
    parameter_a.append(float(info[1]))
IndexError: list index out of range
信息:['1','90.647','4.349','0.252','0.033','93067.188','196.142']
信息:['.]
回溯(最近一次呼叫最后一次):
文件“script.py”,第104行,在
参数_a.append(float(信息[1]))
索引器:列表索引超出范围
我不明白为什么会收到“列表索引超出范围”的消息。如果有人知道为什么会这样,我很乐意听你讲完

我如何解决这个问题?我的方法完全错了吗

编辑:我选择了纯while循环解决方案,考虑了RebelWithoutAPulse和Camjohnson 26的建议。我就是这样解决的:

parameter_a=[]
parameter_b=[]
parameter_c=[] 
k=35 # The script stops reading 'text.txt' after the k:th line.
x=0
while x < 7:
    y=1
    while y < 7:
        j=7 
        path1 = str(list_B_foo[x]) + '/%s/pdata/999/dcon2dpeaks.txt' % (y)
        m = open(path, 'r')
        lines = m.readlines()
        while j < k:
            line = lines[j]
            info = line.split()
            parameter_a.append(float(info[1]))
            parameter_b.append(float(info[2]))
            parameter_c.append(float(info[5]))
            j = j+2
        y = y+1 
    x = x+1
参数_a=[]
参数_b=[]
参数_c=[]
k=35#脚本在第k行之后停止读取“text.txt”。
x=0
当x<7时:
y=1
y<7时:
j=7
path1=str(list_B_foo[x])+'/%s/pdata/999/dcon2dpeaks.txt“%”(y)
m=打开(路径“r”)
行=m.readlines()
而j

Meta:我不确定是否应该把答案给回答最快、帮助我完成任务的人。或者是我最了解答案的人。我相信这是一个常见的问题,我可以通过阅读规则或转到Stackexchange Meta找到答案。在我阅读完建议之前,我将暂缓将问题标记为由你们两人中的任何一人回答。

看起来您正在用文件的第一行覆盖行数组。您可以调用line=m.readlines(),它将line设置为一个行数组。然后设置line=line[j],因此现在line变量不再是数组,而是等于的字符串

1     91.146    4.571   0.064   1.393   939.134     14.765
这个循环工作得很好,但下一个循环将把line当作一个字符数组,并取第四个元素,它只是一个周期,并将其设置为自身相等。这就解释了为什么info变量在循环的第二次传递中只有一个元素

要解决这个问题,只需使用两个行变量,而不是一个。打一条线和另一条线

    lines = m.readlines()
    while j < k:
        line = lines[j]
        info = line.split()
lines=m.readlines()
而j

可能还有其他错误,但这应该让您开始学习。

欢迎使用堆栈溢出

该错误是由于您无意中创建的名称冲突造成的。注意异常发生前的输出:

info: ['1', '90.647', '4.349', '0.252', '0.033', '93067.188', '196.142']
info: ['.']
Traceback (most recent call last):
...
第[1]行无法计算-列表中没有“1”-st元素,仅包含
”。
-在python中,列表以0位置开始

这发生在嵌套循环中

while j < k
因此,在循环的第一次运行时,您将文件的行读取到
line
列表中,然后从列表中取出一行,将其分配给while j < k
line = m.readlines()
    while j < k:
        line = line[j]
        info = line.split()
        ...