2

我编写了一个程序,将几个文本文件合并在一起,然后我尝试使用 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()
4

2 回答 2

1

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

此外,您daysdaterange1. 在该循环的第一次迭代期间,您将遍历f. 这意味着在文件的第二次迭代daterange1中用完了。

此外,您不要days在循环内部使用。

于 2012-09-04T19:11:56.867 回答
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)
于 2012-09-04T20:20:39.213 回答