2017-06-28 11 views
-2

指定されたディレクトリ内の各ファイル内のデータ値を開き、読み込み、アクセスすることを目的とした関数を書いた。空のリストはサマリーCSVファイルの作成に使用されます。forループを通して空のリストに追加するが、私のリストは空のまま出力する

問題は、私のリストがforループの終了時に空であることです。 この問題を回避するにはどうすればよいですか?

私は既存の質問を調べてみましたが、役に立たなかったと思います。

ここに私のコードです:

fileid = [] * len(os.listdir(path)) 
objname = [] * len(os.listdir(path)) 
obsvtype = [] * len(os.listdir(path)) 
filtr = [] * len(os.listdir(path)) 



# Open, read, and iterate over files ending with the .fits extension in inputted path. 
# Assign fits header key data to a variable and then append iteratively to respective empty list. 

for fitsfile in os.listdir(path): 
    if fitsfile[-5:] == '.fits': 
     try: 
      hdulist  = fits.open(str.format(fitsfile)) 

      filename = hdulist[0].data['FILENAME'] 
      fileid.append(filename) 


      object_name = hdulist[0].data['OBJECT'] 
      objname.append(object_name) 

      obsvtyp  = hdulist[0].data['OBSTYPE'] 
      obsvtype.append(obsvtyp) 

      filt  = hdulist[0].data['FILTERS'] 
      filtr.append(filt) 
     except: 
      pass 

print(fileid,objname,obsvtype,filtr) 


# Create an empty pandas dataframe object (data table) and assign populated data lists to dataframe. 
# columns. 

dataframe = pd.DataFrame(data = None) 
dataframe['Filename']   = fileid  
dataframe['Object_Name']  = objname  
dataframe['Observation_type'] = obsvtype 
dataframe['Filter']   = filtr  

print(dataframe) 

# Export compiled dataframe object to a .csv file in specified directory path. 

dataframe.to_csv(path + 'reduc_tbl_result.csv',columns = ['Filename','Object_name', 
    'Observation_Type','Filter'],index = None) 

と結果:

([]、[]、[]、[]) 空DATAFRAME 列:[ファイル名、object_nameの、Observation_type、フィルター] インデックス:[])

ありがとうございます。

+0

最小、完全、および検証可能なサンプルを作成できますか? https://stackoverflow.com/help/mcve – christopherlovell

+0

リストの初期設定に「なし」がありません。次に、事前に初期化された配列に追加します。それとは別に、私はこの例からデバッグすることができないファイルの読み込みで何かがうまくいかなければなりません。 – christopherlovell

+0

まず、try:... except:pass'を使ってやめてください。あなたは、何かがうまくいかなくなったときにはいつでもPythonにシャットダウンするように指示しています。そして、何かがうまくいかず、Pythonがあなたに言わなかったときに私たちに来てください。 ** Pythonが何かが間違っていることを教えさせてください** – user2357112

答えて

0

元の質問に答えて、リストを初期化する必要があります。 appendは失敗していますが、エラーはtryブロックによって捕捉されます。配列は、各APPENDに完全にコピーする必要がありますよう

fileid = [] 

あなたはたくさんのファイルを持っている場合は、追加するには、非常に効率的ではありません。事前にリストを初期化することをお勧めします。

fileid = [None] * len(os.listdir(path)) 

for i, fitsfile in enumerate(os.listdir(path)): 
    fileid[i] = ... 

あなたはまた、例えばhereを参照して、指定した拡張子を持つディレクトリ内のすべてのファイルをリストするためglobモジュールを使用して見たいかもしれません。

+0

それdidn仕事はしません。私はまだ空のcsvファイルをエクスポートしています。他の考え?助けてくれてありがとう。私は最後の数日間、私のコードで交渉してきました。 – xXAsterosXx

+0

これは私が嘲笑した最小限の例で動作するので、エラーはおそらくコードのどこかにあります。上記の私のコメントを参照してください。 – christopherlovell

+0

また、あなたは、終了時にリストが空であると言うが、今はcsvファイルが空であると言っている。リストはまだ空ですか? – christopherlovell

0

次の基本的なコードは、リストにファイルを追加するために使用することができます:あなたのコードの場合

import os 
file_list = [] 
for f in os.listdir(os.getcwd()): 
    file_list.append(f) 
print(file_list) 

、あなたはむしろ、現在の作業ディレクトリより提供パスを使用します。

もっと簡単なものを試してみましょう(つまり、ファイルに適合する処理はありません)。あなたのエラーがリストに追加するのではなく、フィットやパンダのDataframeを使用している可能性があります。

+0

ありがとう...しばらくしてから、私の注意が曖昧になりましたが、あなたは正しいです。私はその戦略に沿って作業し、適切な結論に達しました。私はあなたが投稿したものに類似したコードを試しましたが、ファイルが正しく印刷されていて、問題が必ずしもfor-loop構文ではないことに気付きました、fits.open()はos.listdirの文字列要素の出力を認識しませんでした(経路)を操作することができます。私はあなたが将来/好奇心のために必要とするべきなら、私の作業コードを以下に掲載しました。 – xXAsterosXx

0

私は今後、解決策が必要なユーザーのために問題の原因を認識しています。 fits.open()呼び出しは以下のコードを経由してos.listdir(パス)の文字列要素上で動作していなかったので、上記の私のコードは、空のリストを印刷した

for fitsfile in os.listdir(path): 
     if fitsfile[-5:] == '.fits': 
      try: 
       hdulist  = fits.open(str.format(fitsfile)) 

私はこれを試してみましたが、それは違い製:

for fitsfile in os.listdir(path): 
     if fitsfile[-5:] == '.fits': 
      with fits.open(os.path.join(path,fitsfile)) as hdulist: 
       try: 
        hdu = hdulist[0] 
関連する問題