从子目录执行多个* .dat文件(bash,python)

时间:2016-03-09 11:34:10

标签: python bash shell python-3.x subdirectory

我有以下内容:

  1. 我有子目录的目录,里面填充了文件。结构如下:/periodic_table/{Element}_lj_dat/lj_dat_sim.dat;
  2. 每个文件包含两行(第一行是注释)和12列数据。
  3. 我想要的是浏览所有元素文件夹(例如Al,Cu等),打开创建的文件(例如在periodic_table目录中命名为“mergedlj.dat”)并存储所有来自每个文件的数据,从父目录添加元素名称作为合并文件的第一列(或最后一列)。
  4. 最好的方法是忽略每个文件中的第一行,只保存第二行的数据。

    我对bash / shell脚本非常缺乏经验,但我认为这是最好的方法(Python也可以接受!)。不幸的是,我只对与脚本位于同一文件夹中的文件有过经验,所以这对我来说是一种全新的体验。

    以下是找到这些文件的代码,但实际上它没有做我需要的任何事情:

    find ../periodic_table/*_lj_dat/ -name lj_dat_sim.dat -print0 | while read -d $'\0' file; do 
        echo "Processing $file"
    done
    

    任何帮助都将受到高度赞赏!!

1 个答案:

答案 0 :(得分:0)

这是一个Python解决方案。

您可以使用glob()获取匹配文件的列表,然后使用fileinput.input()进行迭代。 fileinput.filename()允许您获取当前正在处理的文件的名称,这可以用于在新文件处理开始时确定当前元素,由fileinput.isfirstline()确定。

将当前元素添加为合并文件的第一列。我假设输入文件中的字段分隔符是单个空格,但您可以通过更改下面的' '.join()来更改它。

import re
import fileinput
from glob import glob

dir_prefix = '.'
glob_pattern = '{}/periodic_table/*_lj_dat/lj_dat_sim.dat'.format(dir_prefix)
element_pattern = re.compile(r'.*periodic_table/(.+)_lj_dat/lj_dat_sim.dat')

with open('mergedlj.dat', 'w') as outfile:
    element = ''
    for line in fileinput.input(glob(glob_pattern)):
        if fileinput.isfirstline():
            # extract the element name from the file name
            element = element_pattern.match(fileinput.filename()).groups()[0]
        else:
            print(' '.join([element, line]), end='', file=outfile)

您可以使用os.path.join()构建glob和元素正则表达式模式,但我已经省略了上述内容以避免混淆答案。