Python 从多个目录中的txt文件创建dict

Python 从多个目录中的txt文件创建dict,python,python-3.x,Python,Python 3.x,我有一系列目录,其结构类似: 例如 除basepath外,目录名是随机生成的字符串。有几百个不同的目录 在每个目录中,我有两个文件,“body.txt”和“timestamp.txt”。作为最终目标,我希望在一个共同的时间范围内收集每个尸体,比如将每个尸体分成1小时的间隔。timestamp.txt中的数据是秒的整数 我想第一个挑战是获得每个目录和子目录的列表。有人能建议我用什么来获取basepath下的子目录列表吗 然后我需要一种方法来排序和组织这些数据。我知道熊猫有一种按日期分割数据的方法,

我有一系列目录,其结构类似:

例如

除basepath外,目录名是随机生成的字符串。有几百个不同的目录

在每个目录中,我有两个文件,“body.txt”和“timestamp.txt”。作为最终目标,我希望在一个共同的时间范围内收集每个尸体,比如将每个尸体分成1小时的间隔。timestamp.txt中的数据是秒的整数

我想第一个挑战是获得每个目录和子目录的列表。有人能建议我用什么来获取
basepath
下的子目录列表吗

然后我需要一种方法来排序和组织这些数据。我知道熊猫有一种按日期分割数据的方法,这可能是我所知道的最好的选择。如果有人对另一种方法有任何建议,我可以这样做,我很乐意听到

作为我如何组织和分割数据的示例:

Timestamp(s)        Body
300                  a
301                  b
304                  c
306                  d
301                  e
304                  f
301                  g
306                  h
308                  i
307                  j

Split as an interval of 2 secs

Timestamp(s)        Body
300                  a
301                  b
301                  e
301                  g

304                  c
304                  f

306                  d
306                  h

307                  j
308                  i
#我希望您能够创建数据帧
df=pd.DataFrame([[300,'a'],
[301,'b'],
[304,'c'],
[306,'d'],
[301,'e'],
[304,'f'],
[301,'g'],
[306,'h'],
[308,'i'],
[307,'j']],列=['Timestamp','Body'])
#现在您有了数据帧
df.sort_值(by=['Timestamp(s)”,inplace=True)
df.sort_值(by=['Timestamp(s)”,inplace=True)
df['group_id']=df['Timestamp')。应用(lambda x:x-x%2)
对于组名称,df.groupby(['group\u id'])中的组:
打印(组)
输出

0           300    a       300
1           301    b       300
4           301    e       300
6           301    g       300

2           304    c       304
5           304    f       304

3           306    d       306
7           306    h       306
9           307    j       306

8           308    i       308
#我希望您能够创建数据帧
df=pd.DataFrame([[300,'a'],
[301,'b'],
[304,'c'],
[306,'d'],
[301,'e'],
[304,'f'],
[301,'g'],
[306,'h'],
[308,'i'],
[307,'j']],列=['Timestamp','Body'])
#现在您有了数据帧
df.sort_值(by=['Timestamp(s)”,inplace=True)
df.sort_值(by=['Timestamp(s)”,inplace=True)
df['group_id']=df['Timestamp')。应用(lambda x:x-x%2)
对于组名称,df.groupby(['group\u id'])中的组:
打印(组)
输出

0           300    a       300
1           301    b       300
4           301    e       300
6           301    g       300

2           304    c       304
5           304    f       304

3           306    d       306
7           306    h       306
9           307    j       306

8           308    i       308

要读取文件,您可以扫描基本路径中的所有子文件夹,查找名为
body.txt
timestamp.txt
的文件。您可以使用
os.walk
:它递归遍历以基本路径作为根节点的树,并在每次迭代时返回当前文件夹的路径、包含文件夹名称的列表以及该文件夹中的文件列表
os.walk
探索基本路径中的所有子文件夹。然后,您可以在
pandas
数据帧中转换每个
timestamp.txt
body.txt
,并将它们连接在一起。我假设这两个文件每行都有一个样本,类似这样:

timestamp.txt
1609004661.419179
1609004662.419179
1609004663.419179
1609004664.419179
body.txt
B
G
B
G
J
正如您所注意到的,时间戳被假定为格式

下面是一个代码示例:

导入操作系统
作为pd进口熊猫
基本路径='您的基本路径'
BODY_NAME='BODY.txt'
TIMESTAMP_NAME='TIMESTAMP.txt'
bds=[]#在“body.txt”文件中收集数据的列表
ts=[]
对于os.walk(基本路径)中的父目录、文件夹和文件:
打印(父目录、文件夹、文件)
尝试:
bds.append(pd.read\u csv(os.path.join(父目录,主体名称),头=无,名称=['BODY']))
附加(
pd.read\u csv(os.path.join(parent\u dir,TIMESTAMP\u NAME),header=None,names=['TIMESTAMP'],
转换器={'timestamp':lambda x:pd.to_datetime(float(x),unit='s')}
)
除FileNotFoundError外:
传递#处理没有两个文件之一的文件夹
数据=pd.concat((pd.concat(ts,axis=0),pd.concat(bds,axis=0),axis=1)。排序值('timestamp')。重置索引(drop=True)
运行前面的代码,
data
如下所示:

时间戳主体
0 2020-12-26 17:44:21.419178963 b
1 2020-12-26 17:44:21.419178963摄氏度
2 2020-12-26 17:44:21.421484947华氏度
3 2020-12-26 17:44:21.421484947东经
4 2020-12-26 17:44:21.421484947 j
5 2020-12-26 17:44:22.419178963华氏度
6 2020-12-26 17:44:22.419178963克
7 2020-12-26 17:44:22.421484947华氏度
8 2020-12-26 17:44:22.421484947华氏度
9 2020-12-26 17:44:22.421484947 i
10 2020-12-26 17:44:23.419178963 k
11 2020-12-26 17:44:23.419178963 b
12 2020-12-26 17:44:23.421484947 b
13 2020-12-26 17:44:23.421484947 d
14 2020-12-26 17:44:23.421484947 i
对于问题的第二部分,您可以使用
重采样
(在制作
时间戳
数据帧
索引后)在不同的
数据帧
中以两秒钟的间隔收集数据:

data.set_索引('timestamp',drop=True,inplace=True)
重采样=数据。重采样('2s')
df_2sec={}
对于枚举(重采样)中的i(时间戳,df):
df_2sec[i]=df
这里是前两个数据帧(
df_2sec[0]
df_2sec[1]
):

正文
时间戳
2020-12-26 17:44:21.419178963 b
2020-12-26 17:44:21.419178963摄氏度
2020-12-26 17:44:21.421484947华氏度
2020-12-26 17:44:21.421484947东经
2020-12-26 17:44:21.421484947 j
2020-12-26 17:44:22.419178963华氏度
2020-12-26 17:44:22.419178963克
2020-12-26 17:44:22.421484947华氏度
2020-12-26 17:44:22.421484947华氏度
2020-12-26 17:44:22.421484947 i
身体
时间戳
2020-12-26 17:44:23.419178963 k
2020-12-26 17:44:23.419178963 b
2020-12-26 17:44:23.421484947英国
2020-12-26 17:44:23.421484947
2020-12-26 17:44:23.421484947 i
2020-12-26 17:44:24.419178963克
2020-12-26 17:44:24.419178963 d
2020-12-26 17:44:24.421484947 i
2020-12-26 17:44:24.421484947东经
2020-12-26 17:44:24.421484947 i
您可以更改重新采样的开始时间戳(我选择了第一个)