2

複数のテキスト ファイルをマージするプログラムを作成しました。そこから、複数の異なる日付があるため、for ループを使用して最初の列に日付を追加しようとしています。ただし、これらのループを使用すると、プログラムは適切に反復されないようです。

サポート テキスト ファイルには、日付のない時間のリストがあります。ただし、各テキスト ファイルは異なる日付に関連付けられています。すべてのテキスト ファイルを 1 つのテキスト ファイルにまとめて使いやすくしていますが、便利にするために、テキスト ファイルの最初の列に表示される時刻に日付を追加しようとしています。

コードは次のようになります。

    import glob
    from datetime import *
    mon = [6, 7]
    dayrange1 = [24, 25, 26, 27, 28, 29, 30]
    dayrange2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    m = 0
    d1 = 0
    d2 = 0
    newline = []



    fout = open("C:\\Users\\jessica.macleod\\Desktop\\SurmontArray1.txt", "a")
    for filename in glob.glob("C:\\Users\\jessica.macleod\\Desktop\\Surmont Noise Files\\s1-424surmontnoise2012*.txt"):
        f = open(filename)
        f.next()
        f.next()
        d1 = 0
        d2 = 0
        for months in mon:

            if m == 0:

                for days in dayrange1:

                    for line in f:
                        line += str(date(2012, mon[m], dayrange1[d1])) + " "
                        fout.write(line)
                    d1 = d1 + 1
                m = m + 1


            if m == 1:

                for days in dayrange2:

                    for line in f:
                        line += str(date(2012, mon[m], dayrange2[d2])) + " "
                        fout.write(line)
                    d2 = d2 + 1




        f.close()
    fout.close()
4

2 に答える 2

1

dayrange1に設定しfor months in monたため、 の 2 番目のループでは繰り返されません。conditional によって保護されているため、スキップされます。これは、グロブ内で最初に一致したファイル名のみが、 を反復した結果を持つことを意味します。ループの 1 つの内部にリセットする必要があります。m1if m == 0:dayrange1m0

daysまた、で繰り返しますdaterange1。そのループの最初の反復中に、 の内容全体を反復しますf。つまり、2 回目の反復でdaterange1ファイルが使い果たされます。

daysまた、ループ内では使用しません。

于 2012-09-04T19:11:56.867 に答える
0

日付ループとファイル名ループを組み合わせることで、反復の問題を最もよく解決できると思います。プログラムをどの程度柔軟にするか、または決定論的にするかによって、これを行うには 2 つの方法があります。

  • プログラムにハードコードする特定の日にのみプログラムを動作させる必要がある場合は、日付ループを実行し、それらの日に対応するファイルを直接開く必要があります (ファイル名のグロビングやループは行わないでください)。

  • 代わりに、データ ファイルがあるすべての日をプログラムで処理する場合は、glob ループを優先して日付ループを削除し、ファイル名を解析して関連する日付を取得する必要があります。

最初のケースのテストされていないコードを次に示します。

from datetime import date

months = [6, 7]
days = { 6 : [24, 25, 26, 27, 28, 29, 30],
         7 : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] }

output_filename = "SurmontArray1.txt"
filename_template = "Surmont Noise Files\\s1-424surmontnoise2012%2d%2d.txt"

with open(output_filename, "a") as f_out:
    for month in months:
        for day in days[month]:
            with open(filename_template% (month, day)) as f_in:
                date_str = str(date(2012, month, day)) + " "
                for line in f_in:
                    f_out.write(date_str + line)

2番目のケースのコードは次のとおりです。

from datetime import date
import glob
import re

output_filename = "SurmontArray1.txt"

with open(output_filename, "a") as f_out:
    filenames = glob.glob("Surmont Noise Files\\s1-424surmontnoise2012*.txt")
    for filename in filenames:
        year, month, day = re.search(r'(\d\d\d\d)(\d\d)(\d\d)\.txt',
                                     filename).groups()
        with open(filename) as f_in:
            for line in f_in:
                date_str = str(date(year, month, day)) + " "
                for line in f_in:
                    f_out.write(date_str + line)
于 2012-09-04T20:20:39.213 に答える