Python 在不同的文件中按组写入行

Python 在不同的文件中按组写入行,python,file,Python,File,我有一个小脚本,它不是很好地为我工作,希望你能帮助和发现问题 我有两个起始文件: traveltimes:包含我需要的行,它是一个列文件(每行只有一个数字)。我需要的行由一行分隔,该行以11个空格开头 标题行:包含三个标题行 输出文件:我想获取29个文件(STA%s)。里面是什么?每个文件都将包含相同的标题行,在此之后我希望附加traveltimes文件中包含的一组行(每个文件一组不同的行)。每组行由74307行(1列)组成 到目前为止,这个脚本创建了29个具有相同标题行的文件,但它混淆了所有内

我有一个小脚本,它不是很好地为我工作,希望你能帮助和发现问题

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

标题行:包含三个标题行

输出文件:我想获取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))
建议:

  • 首先读取标题行。在继续操作之前,请确保此操作有效。代码的其余部分都不需要在下面缩进
  • 考虑编写一个单独的函数,将traveltimes文件分组到列表列表中
  • 一旦您有了一个工作的traveltimes阅读器和grouper,只有创建一个新的STA文件,将标题打印到其中,然后将时间组写入其中
一步一步地建立你的程序,确保它在每一步都达到你的期望。不要试图一次完成所有工作,因为这样你就不容易找到问题所在

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

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)) 
此代码未经测试,因为我没有示例数据。希望您能了解要点。

建议:

  • 首先读取标题行。在继续操作之前,请确保此操作有效。代码的其余部分都不需要在下面缩进
  • 考虑编写一个单独的函数,将traveltimes文件分组到列表列表中
  • 一旦您有了一个工作的traveltimes阅读器和grouper,只有创建一个新的STA文件,将标题打印到其中,然后将时间组写入其中
一步一步地建立你的程序,确保它在每一步都达到你的期望。不要试图一次完成所有工作,因为这样你就不容易找到问题所在

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

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

此代码未经测试,因为我没有示例数据。希望您能理解它的要点。

我确信错误在最后四行,因为头已经正确地写入了所有29个文件中;不管怎样,我会尽量按照你的建议去做……你的建议对我来说很好,但第二点还不太清楚,我的意思是,你怎么能把空白作为迭代的关键呢?你能举个小例子吗?干杯我刚刚否决了那个建议。If需要一个有状态的分组函数,这可能是一个不必要的复杂问题(因为你已经接近了)。是的,但它仍然是我的主要问题。我最大的问题是如何对它们进行分组,以便在以后将它们写入一个文件groupby中的STAU计数器是什么?我很确定错误出现在最后四行,因为头已正确写入所有29个文件中;不管怎样,我会尽量按照你的建议去做……你的建议对我来说很好,但第二点还不太清楚,我的意思是,你怎么能把空白作为迭代的关键呢?你能举个小例子吗?干杯我刚刚否决了那个建议。If需要一个有状态的分组函数,这可能是一个不必要的复杂问题(因为你已经接近了)。是的,但它仍然是我的主要问题。我最大的问题是如何对它们进行分组,以便在以后将它们写入文件中groupby中的STAU计数器是什么?