2016-03-24 13 views
0

質問があります。入力ファイル名を使用して出力ファイルの名前を変更するにはどうすればよいですか?入力ファイル名を使用して新しいファイルを作成する

例えば、私の入力ファイル名は次のとおりです。

Field_52_combined_final_roughcal.fits 

ように私は、出力ファイル名を取得したい:私は書くことができることを知っている

Field_52_traitement_1.fits 

hdu.writeto('Field_52_traitement_1.fits') 

しかし、私は200のファイルをループする他のスクリプトを持っています。入力ファイル名

私のスクリプトは、この(1つの入力ファイル用)のようになります。

#!/usr/bin/python 
# coding: utf-8 

from astropy.io import fits 
from astropy.table import Table 
import numpy as np 

       ################################### 
       # Fichier contenant le champ brut # 
       ################################### 

filename = 'E:/Fields/Field52_combined_final_roughcal.fits' 

# Ouverture du fichier à l'aide d'astropy 
field = fits.open(filename)   

# Lecture des données fits 
tbdata = field[1].data    

       ####################################################### 
       # Application du tri en fonction de divers paramètres # 
       ####################################################### 

Several conditions/sort 

     ################################################### 
     # Ecriture du résultat dans nouveau fichier .fits # 
     ################################################### 

hdu = fits.BinTableHDU(data=tbdata_final) 
hdu.writeto('{}_{}'.format(filename,'traitement_1'))  

しかし、スクリプトのこの種で、私が手:あなたが任意のアイデアを持っている場合

Field_52_combined_final_roughcal.fits_traitement_1 

は、教えてください、ウェブサイトまたは他の何か: あなたの答えをありがとう!

だからあなたのコード、使用することを適用する
+0

あなたが使用することができます'os.path'関数は、ファイル名を拡張子から区切ったり、一貫してアンダースコアを使うように見えるので、ファイル名のすべての部分のリストを取得するために' filename.split( "_") 'を実行するだけです。その後、リストのインデックスを使用して別の順序で一緒に戻すことができます。インデックス0は「フィールド」、インデックス1は「52」などとなります。その後、新しいファイル名を作成するために "_"。join() 'することができます。 – jDo

+0

あなたの答えをありがとう。私はスプリットメソッドを使用し、それは仕事です: – Deadpool

答えて

2

あなたは単純な文字列メソッドを交換し、出力ファイル名の変数を作成し使用することができます。

​​

今だけ今は 'OUTNAME' という名前のファイルに書き込む:

E:/Fields/Field52_traitement_1.fits

+0

完璧!両方のソリューションは非常に面白いです!これは特にスマートです! – Deadpool

+0

@ Astrolabe1993これは、すべての入力ファイルが最後に 'combined_final_roughcal'を持っている場合にのみ機能します。それは私の場合よりも少し速くなければならないので、あなたの場合はこのソリューションを使用してください。 –

+0

@Tony Babarino現時点では、すべての入力ファイルの名前は同じです。各ファイルについてフィールド番号のみが異なります。 – Deadpool

1
>>> filename = 'Field_52_combined_final_roughcal.fits' 
>>> filename.split('_') 
['Field', '52', 'combined', 'final', 'roughcal.fits'] 
>>> filename.split('_')[:2] 
['Field', '52'] 
>>> '_'.join(filename.split('_')[:2]) 
'Field_52' 

hdu.writeto('{}_{}'.format('_'.join(filename.split('_')[:2]),'traitement_1')) 

の代わり:

hdu.writeto('{}_{}'.format(filename,'traitement_1')) 
+0

ありがとう!私は同じ始まりだったが、私はhdu.writetoをブロックしていた。 ありがとうございます! – Deadpool

1

は、ここでそれを行うための一つの方法です。 「最良の」方法は、ファイル名をどのように動的にするかによって異なります。例えば。あなたが「熟成」を増やしたいと思うかどうか。

インタプリタで
def create_new_filename(old_filename, traitement): 
    pieces = old_filename.split("_") 
    return "_".join([pieces[0], pieces[1], "traitement", str(traitement)]) + ".fits" 

>>> print create_new_filename("Field_52_combined_final_roughcal.fits", 1) 
Field_52_traitement_1.fits 

あなたのケースでそれを使用するには、古いファイル名としたいtraitement番号を渡したい:

hdu.writeto(create_new_filename("Field_52_combined_final_roughcal.fits", 1)) 
+0

あなたのスクリプトは便利です。しかし、私はこの文字列が私の最初のスクリプトの結果を表しているので、 "traitement"を増やす必要はありません。その後、私は出力ファイルを取って、私は2番目のスクリプトを実行します。私は(例えば)得る:Field_52_traitement_2.fits等;) – Deadpool

+0

クールクール。私はちょうどそれを少し一般的にしようとします。それはあなたのためには必要ではないかもしれませんが、そのようにすれば、すべてのテストを1つのスクリプトに収めて、すべてのテストをforループで自動的に実行できます。 – jDo

関連する問題