从子目录(bash、python)执行多个*.dat文件
我有以下资料:从子目录(bash、python)执行多个*.dat文件,python,bash,shell,python-3.x,subdirectory,Python,Bash,Shell,Python 3.x,Subdirectory,我有以下资料: 我有一个包含子目录的目录,子目录中充满了文件。结构如下:/周期表/{Element}\ulj\u dat/lj\u dat\u sim.dat 每个文件由两行(第一行是注释)和12列数据组成 我想得到的是遍历元素的所有文件夹(如Al、Cu等),打开创建的文件(例如周期表目录中名为“mergedlj.dat”),并将每个文件中的所有数据存储在父目录中的一个添加元素名中,作为合并文件的第一(或最后)列 最好的方法是忽略每个文件中的第一行,只保存第二行的数据 我在bash/shell脚
/周期表/{Element}\ulj\u dat/lj\u dat\u sim.dat
李>
周期表
目录中名为“mergedlj.dat”),并将每个文件中的所有数据存储在父目录中的一个添加元素名中,作为合并文件的第一(或最后)列find ../periodic_table/*_lj_dat/ -name lj_dat_sim.dat -print0 | while read -d $'\0' file; do
echo "Processing $file"
done
我们将非常感谢您的帮助 这里有一个Python解决方案 您可以使用获取匹配文件的列表,然后使用进行迭代
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和element regex模式,但为了避免混淆答案,我省略了上面的内容。看看python的os
模块。它可以很好地引导您浏览目录树。是的,我对python的实现有一个想法,但我认为bash应该很简单(更短)。。。无论如何,谢谢,如果我用Python来做,我会把它贴在这里。谢谢你的回答!它起作用了,但我改变了以下内容:glob_pattern='{}/*\u lj_dat/lj_dat_sim.dat'.format(dir_prefix)
和element_pattern=re.compile(r'(.+)\u lj_dat/lj_dat_sim.dat'
,因为只要我把代码文件放在“周期表”目录中,代码就会循环。再次感谢!