簡體   English   中英

從子目錄(bash,python)執行多個* .dat文件

[英]Execute multiple *.dat files from subdirectories (bash, python)

我有以下幾點:

  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解決方案。

您可以使用glob()獲取匹配文件的列表,然后使用fileinput.input()遍歷它們。 fileinput.filename()可以獲取當前正在處理的文件的名稱,並且可以在每次對新文件開始處理時fileinput.isfirstline()fileinput.isfirstline()確定fileinput.filename() ,該名稱可用於確定當前元素。

當前元素被添加為合並文件的第一列。 我假設輸入文件中的字段分隔符是一個空格,但是您可以通過更改下面的' '.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和元素正則表達式模式,但是為了避免弄亂答案,我在上面省略了它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM