在不同的文件中逐组写行

时间:2011-10-25 04:43:41

标签: python file

我有一个小脚本对我来说效果不好,希望你能帮忙找到问题。

我有两个起始文件: traveltimes:包含我需要的行,它是一个列文件(每行只有一个数字)。我需要的行由一行开头,该行以11个空格开头

标题行:包含三个标题行

output_file:我想获得29个文件(STA%s)。里面有什么?每个文件都将包含相同的标题行,之后我想附加traveltimes文件中包含的一组行(每个文件的一组不同的行)。每组线由74307行(1列)

组成

到目前为止,这个脚本创建了29个具有相同标题行的文件,但随后它混合了所有内容,我的意思是它写了一些内容,但它并不是我想要的。

任何想法????

def make_station_files(traveltimes, header_lines):
"""Gives the STAxx.tgrid files required by loc3d"""
sta_counter = 1
with open (header_lines, 'r') as file_in:
    data = file_in.readlines()
    for i in range (29):
        with open ('STA%s' % (sta_counter), 'w') as output_files: 
            sta_counter += 1
            for i in data [0:3]:
                values = i.strip()                   
                output_files.write ("%s\n\t1\n" % (values))
                with open (traveltimes, 'r') as times_file:
                    #collector = []
                    for line in times_file:
                            if line.startswith ("            "):
                                break
                            output_files.write ("%s" % (line))

1 个答案:

答案 0 :(得分:1)

建议:

  • 首先阅读标题行。在继续之前确保此方法有效。其余的代码都不需要在此下缩进。
  • 考虑编写一个单独的函数,将旅行时文件分组到列表列表中。
  • 一旦你有一个工作的旅行时读者和石斑鱼,只有创建一个新的STA文件,打印标题,然后写入时间组。

逐步构建您的程序,确保它在每一步都能达到预期效果。不要试图一次性完成所有这一切,因为那样你就不能轻易找到问题所在。

我对您的脚本的快速编辑使用 itertools.groupby()作为石斑鱼。它有点高级,因为分组功能是有状态的,并在可变列表中跟踪它的状态:

def make_station_files(traveltimes, header_lines):
    'Gives the STAxx.tgrid files required by loc3d'

    with open (header_lines, 'r') as f:
        headers = f.readlines()

    def station_counter(line, cnt=[1]):
        'Stateful station counter -- Keeps the count in a mutable list'
        if line.strip() == '':
            cnt[0] += 1
        return cnt[0]

    with open(traveltimes, 'r') as times_file:
        for station, group in groupby(times_file, station_counter):
            with open('STA%s' % (station), 'w') as output_file:
                for header in headers[:3]:
                    output_file.write ('%s\n\t1\n' % (header.strip()))
                for line in group:
                    if not line.startswith('           '):
                        output_file.write ('%s' % (line)) 

此代码未经测试,因为我没有样本数据。希望你能得到它的要点。