【问题标题】:Execute multiple *.dat files from subdirectories (bash, python)从子目录(bash、python)执行多个 *.dat 文件
【发布时间】:2016-03-09 11:34:10
【问题描述】:

我有以下几点:

  1. 我有一个目录,其中包含充满文件的子目录。结构如下:/periodic_table/{Element}_lj_dat/lj_dat_sim.dat;
  2. 每个文件由两行(第一行是评论)和 12 列数据组成。
  3. 我想要的是浏览所有元素文件夹(例如 Al、Cu 等),打开创建的文件(例如 periodic_table 目录中名为“mergedlj.dat”的文件)并存储所有数据从一个文件中的每个文件中添加来自父目录的元素名称作为合并文件的第一列(或最后一列)。

最好的方法是忽略每个文件的第一行,只保存第二行的数据。

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

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

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

任何帮助将不胜感激!

【问题讨论】:

  • 查看python的os模块。它可以很好地通过目录树walk你。
  • 是的,我对 python 实现有一个想法,但我认为 bash 应该很容易(更短)......无论如何,谢谢,如果我要用 Python 来做,我会在这里发布。跨度>

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


【解决方案1】:

这是一个 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 和元素正则表达式模式,但我在上面省略了这一点,以免弄乱答案。

【讨论】:

  • 感谢您的回答!它有效,但我更改了以下内容:glob_pattern = '{}/*_lj_dat/lj_dat_sim.dat'.format(dir_prefix)element_pattern = re.compile(r'(.+)_lj_dat/lj_dat_sim.dat'
  • 因为只要我把代码文件放在“periodic_table”目录本身,代码就被循环了。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 2017-04-14
  • 2018-08-06
相关资源
最近更新 更多