2016-06-23 18 views
2

私はtxtファイルから情報を呼び出すプログラムを持っています。テキストファイルの各行は、別のディレクトリにあるファイル全体に対応しています。私はtxtファイル(1行目)から情報を読み込み、ディレクトリ(ファイル1)の対応するファイルの情報を出力ファイルに書きたいと思っています。私は複数のファイルを扱うために自分のコードが必要です。どのようにして、それぞれのループを相互に対応させて正しい出力を得ることができますか?ループ内でループの同時実行

import datetime 
import glob 

f = open('\\_spec_final.t15', 'w') 
infofile = open('info.txt', 'rt') 
num_lines = sum(1 for line in 'info.txt') 
count = 0 
while count <= num_lines 
    for line in infofile: 
     lat = float(line[88:94]) 
     lon = float(line[119:127]) 
     year = int(line[190:194]) 
     month = int(line[195:197]) 
     day = int(line[198:200]) 
     hour = int(line[201:203]) 
     minute = int(line[204:206]) 
     second = int(line[207:209]) 
     dur = float(line[302:315]) 
     numpoints = float(line[655:660]) 
     fov = line[481:497] # field of view? 
     sza = float(line[418:426]) 
     snr = 0.0000 
     roe = 6396.2 
     res = 0.5000 
     lowwav = float(lowwav) 
     highwav = float(highwav) 
     spacebw = (highwav - lowwav)/ numpoints 

     d = datetime.datetime(year, month, day, hour, minute, second) 
     f.write('{:>12.5f}{:>12.5f}{:>12.5f}{:>12.5f}{:>8.1f}'.format(sza,roe,lat,lon,snr)) # line 1 
     f.write("\n") 
     f.write('{:>10d}{:>5d}{:>5d}{:>5d}{:>5d}{:>5d}'.format(year,month,day,hour,minute,second)) # line 2 
     f.write("\n") 
     f.write(('{:%Y/%m/%d %H:%M:%S}'.format(d)) + "UT Solar Azimuth:" + ('{:>6.3f}'.format(sza)) + " Resolution:" + ('{:>6.4f}'.format(res)) + " Duration:" + ('{:>6.2f}'.format(dur))) # line 3 
     f.write("\n") 
     f.write('{:>21.13f}{:>26.13f}{:>24.17e}{:>12f}'.format(lowwav,highwav,spacebw,numpoints)) # line 4 
     f.write("\n") 

     path = '/Users/140803/*' 
     files = glob.glob(path) 
     for file(count) in files: 
      g = open(file, 'r') 
      #do stuff 
      g.close() 

f.close() 
infofile.close() 
+0

私はこの記事を編集してpythonタグを追加しました。これは、適切な人にそれを見てもらうためのものです。 – nbryans

答えて

2

会話に基づいて、内部ループをまったく持つ必要はないようです。複数のネストされたループが存在する必要はありません。私はここにあなたのコードの一部を書き直しました。具体的に

、あなたが何かを反復し、同時にそれを数え、ないは、それらのループの出力は

0 item1 
0 item2 
0 item3 
1 item1 
1 item2 
1 item3 
2 item1 
2 item2 
2 item3 
ようになります

for count in range(3): 
    for item in iterator: 
     print("%d %s" % (count, item)) 

ような何かを行いたい場合

あなたは何ですかdo wantはですカウンタを使用している間

import datetime 
import glob 

path = '/Users/140803/*' 
files = glob.glob(path) 

with open('\\_spec_final.t15', 'w') as f: 
    with open('info.txt', 'rt') as infofile: 
     for count, line in enumerate(infofile): 
      lat = float(line[88:94]) 
      lon = float(line[119:127]) 
      year = int(line[190:194]) 
      month = int(line[195:197]) 
      day = int(line[198:200]) 
      hour = int(line[201:203]) 
      minute = int(line[204:206]) 
      second = int(line[207:209]) 
      dur = float(line[302:315]) 
      numpoints = float(line[655:660]) 
      fov = line[481:497] # field of view? 
      sza = float(line[418:426]) 
      snr = 0.0000 
      roe = 6396.2 
      res = 0.5000 
      lowwav = float(lowwav) 
      highwav = float(highwav) 
      spacebw = (highwav - lowwav)/ numpoints 

      d = datetime.datetime(year, month, day, hour, minute, second) 
      f.write('{:>12.5f}{:>12.5f}{:>12.5f}{:>12.5f}{:>8.1f}'.format(sza,roe,lat,lon,snr)) # line 1 
      f.write("\n") 
      f.write('{:>10d}{:>5d}{:>5d}{:>5d}{:>5d}{:>5d}'.format(year,month,day,hour,minute,second)) # line 2 
      f.write("\n") 
      f.write(('{:%Y/%m/%d %H:%M:%S}'.format(d)) + "UT Solar Azimuth:" + ('{:>6.3f}'.format(sza)) + " Resolution:" + ('{:>6.4f}'.format(res)) + " Duration:" + ('{:>6.2f}'.format(dur))) # line 3 
      f.write("\n") 
      f.write('{:>21.13f}{:>26.13f}{:>24.17e}{:>12f}'.format(lowwav,highwav,spacebw,numpoints)) # line 4 
      f.write("\n") 

      with open(files[count], 'r') as g: 
       #do stuff (to g presumably) 

:辺に沿ってカウンターをあなたのイテレータを実行します0関数は、:

for count, item in enumerate(iterator): 
    print("%d %s" % (count, item)) 

これは私がwith ...ですべてopen() ... close()構造を置き換え、また

0 item1 
1 item2 
2 item3 

を印刷しますfilesに実際にあなたがしたいことがあります、私はこれは非常にありそうもないと思う。私はあなたが実際にロードした情報に基づいてファイル名を生成し、それを開くことを実際に試みていると思います。グロブの問題は、同じプログラムの2つの異なる実行間で同じ順序で結果を返すことさえ保証されていないことです。

+0

ありがとう!これは非常に役立ちます! – alli

+1

問題ありません。私はこれが、あなたの直面する問題を解決するだけでなく、どんなループがより明確になるかを考えるのに役立つことを願っています。 upvoteも与えることを検討してください。 –

+0

質問:私はこのコードを更新していますが、現在と同じ方法でカウントを繰り返すことを望みますが、情報を次々に印刷するのではなく、ファイルに情報を書きたいと思いますそれが2番目のカウントに戻るときに上書きします。そうするためのヒント? – alli

0

files = glob.glob(path)を実行した後、filesは、ファイル名の文字列のリストが含まれています。 for file in files:を実行すると、変数fileに文字列filenameが含まれます。したがって、次のようにループを変更することができます。

for file in files: 
    with open(file) as g: #<--- file is the filename 
     #do stuff 

ループは既にファイル内の各ファイルを通過しているため、カウンタを使用する必要はありません。

+0

ありがとうございますが、一度にすべてのファイルを実行したくない場合は、1つを実行してから、ネストされたループに戻り、txtファイルの別の行を読み込み、このループを実行しますカウンタは両方のループを同じタスクに保つのには良いと思っていましたが、これはどうすればよいか分かりません) – alli

+0

その場合は、 'txtファイル'全体を読み込み、これらのファイルを 'files'リストに保存してください。次に、それぞれのループを実行するループを実行します。テキストファイルで開こうとするファイル名があるときになぜ 'glob'に頼っているのかわかりません。 – nbryans

+0

私はあなたの質問をより明瞭に編集してみましょう。 – alli

関連する問題