Python 加载多个文件 - 嵌套循环
Python Load in multiple files - nested loop
几天以来我一直在为一个问题而苦苦挣扎。我有 100 个不同的时间文件夹,每个文件夹包含 11 个 sensor1.dat、sensor2.dat 等文件。
sensor1.dat
的示例
x1,x2,x3
1,2,3
4,5,6
7,8,9
我正在尝试遍历所有时间文件夹并为每个时间步加载传感器文件的最后一行
结果可能是一个嵌套列表:
Outer list 包含时间数据 - Inner List 为每个时间数据所有 sensor_data,这意味着:Outer List 100 行,inner list 11 行每个外行。
因此我尝试了以下操作:
def getData():
for TIME in TIMES:
cd_string = TIME
cd_string = string.replace(cd_string,'\n','')
os.chdir(cd_string)
print(TIME)
i_sensors=11
data=[]
for i in xrange(1,i_sensors+1):
#print i
sensor_string='../../sets/'+cd_string+'/w_z_sensor_'+str(i)+'_U.dat'
data_input = np.genfromtxt(sensor_string, delimiter="," , skip_header=1)
data.append(data_input[-1,:])
os.chdir('../')
return data
######MAIN####
TIMES = os.popen("ls -d 0.31* ").readlines()
zw=[[]] #*len(TIMES)
for i in xrange(0,len(TIMES)):
zw[i].append(getData())
函数 getData 工作正常,我得到了每个时间步长传感器文件所需的所有数据,
问题是主要部分。在这里,我正在尝试为每个时间文件夹附加传感器数据。这是行不通的。使用未注释的 z=[[]]*len(TIMES) 它只复制 100 行中的数据
我的问题在哪里?
有什么建议和提前致谢吗?
就像 jonrsharpe 提到的那样,您的问题是,当您使用 *
运算符创建列表时,它实际上在内部创建了那么多的列表位置,并将您提供的列表中的元素复制到新的列出索引。如果列表包含引用对象,它会复制引用而不是复制引用的内容,因此如果您对一个位置的任何引用进行任何更改,它将反映在所有其他位置。
例子-
>>> lst = [[1]] * 10
>>> lst
[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
>>> lst[0][0] = 5
>>> lst
[[5], [5], [5], [5], [5], [5], [5], [5], [5], [5]]
您应该尝试使用列表理解来初始化列表 -
示例 -
>>> lst = [[1] for _ in range(10)]
>>> lst
[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
>>> lst[0][0] = 5
>>> lst
[[5], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
你的情况 -
zw=[[] for _ in range(len(TIMES))]
几天以来我一直在为一个问题而苦苦挣扎。我有 100 个不同的时间文件夹,每个文件夹包含 11 个 sensor1.dat、sensor2.dat 等文件。
sensor1.dat
的示例x1,x2,x3
1,2,3
4,5,6
7,8,9
我正在尝试遍历所有时间文件夹并为每个时间步加载传感器文件的最后一行
结果可能是一个嵌套列表: Outer list 包含时间数据 - Inner List 为每个时间数据所有 sensor_data,这意味着:Outer List 100 行,inner list 11 行每个外行。
因此我尝试了以下操作:
def getData():
for TIME in TIMES:
cd_string = TIME
cd_string = string.replace(cd_string,'\n','')
os.chdir(cd_string)
print(TIME)
i_sensors=11
data=[]
for i in xrange(1,i_sensors+1):
#print i
sensor_string='../../sets/'+cd_string+'/w_z_sensor_'+str(i)+'_U.dat'
data_input = np.genfromtxt(sensor_string, delimiter="," , skip_header=1)
data.append(data_input[-1,:])
os.chdir('../')
return data
######MAIN####
TIMES = os.popen("ls -d 0.31* ").readlines()
zw=[[]] #*len(TIMES)
for i in xrange(0,len(TIMES)):
zw[i].append(getData())
函数 getData 工作正常,我得到了每个时间步长传感器文件所需的所有数据,
问题是主要部分。在这里,我正在尝试为每个时间文件夹附加传感器数据。这是行不通的。使用未注释的 z=[[]]*len(TIMES) 它只复制 100 行中的数据
我的问题在哪里?
有什么建议和提前致谢吗?
就像 jonrsharpe 提到的那样,您的问题是,当您使用 *
运算符创建列表时,它实际上在内部创建了那么多的列表位置,并将您提供的列表中的元素复制到新的列出索引。如果列表包含引用对象,它会复制引用而不是复制引用的内容,因此如果您对一个位置的任何引用进行任何更改,它将反映在所有其他位置。
例子-
>>> lst = [[1]] * 10
>>> lst
[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
>>> lst[0][0] = 5
>>> lst
[[5], [5], [5], [5], [5], [5], [5], [5], [5], [5]]
您应该尝试使用列表理解来初始化列表 -
示例 -
>>> lst = [[1] for _ in range(10)]
>>> lst
[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
>>> lst[0][0] = 5
>>> lst
[[5], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
你的情况 -
zw=[[] for _ in range(len(TIMES))]