For Loop Not Iterating恰当

时间:2012-09-04 18:57:42

标签: python loops merge

我写了一个程序,将几个文本文件合并在一起,从那里,我试图使用for循环向第一列添加日期,因为有几个不同的日期。但是,使用这些循环,程序似乎没有正确迭代。

支持文本文件包含没有日期的时间列表;但是,每个文本文件都与不同的日期相关联。我将所有文本文件合并为一个文本文件以便于使用,但为了使其有用,我尝试将日期添加到文本文件的第一列中显示的时间。

这是代码的样子:

    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()

2 个答案:

答案 0 :(得分:1)

dayrange1未在for months in mon的第二个循环中进行迭代,因为您已将m设置为1。它被跳过,因为它受到条件if m == 0:的保护。这意味着只有glob中第一个匹配的文件名将具有迭代dayrange1的结果。您需要在其中一个循环中将m重置为0

此外,您在days中迭代daterange1。在该循环的第一次迭代期间,您将遍历f的整个内容。这意味着在daterange1上的第二次迭代中文件已用完。

此外,您不要在循环中使用days

答案 1 :(得分:0)

我认为通过将日期循环与文件名循环相结合,您可以最好地解决迭代问题。这有两种方法,取决于您希望程序的灵活性或确定性:

  • 如果您只需要程序在特定日期工作,您将硬编码到程序中,您应该执行日期循环并直接打开与这些日期对应的文件(没有通配和循环文件名)。

  • 如果您希望程序处理您拥有数据文件的所有日期,则应该删除日期循环以支持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)

这是第二种情况的代码:

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)