![](/img/trans.png)
[英]Python move all files from multiple subdirectories to different corresponding subdirectories
[英]Execute multiple *.dat files from subdirectories (bash, python)
我有以下幾點:
/periodic_table/{Element}_lj_dat/lj_dat_sim.dat
; 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.