запись строк по группам в разные файлы

#python #file

#python #файл

Вопрос:

У меня есть небольшой скрипт, который мне не подходит, надеюсь, вы сможете помочь и найти проблему.

У меня есть два начальных файла: 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 ("%snt1n" % (values))
                with open (traveltimes, 'r') as times_file:
                    #collector = []
                    for line in times_file:
                            if line.startswith ("            "):
                                break
                            output_files.write ("%s" % (line))
 

Ответ №1:

Предложение:

  • Сначала прочтите строки заголовка. Убедитесь, что это работает, прежде чем продолжить. Ни один из остальных фрагментов кода не должен иметь отступа под этим.
  • Подумайте о написании отдельной функции для группировки файла traveltimes в список списков.
  • Как только у вас будет рабочий считыватель и группировщик traveltimes, только после этого создайте новый 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 ('%snt1n' % (header.strip()))
                for line in group:
                    if not line.startswith('           '):
                        output_file.write ('%s' % (line)) 
 

Этот код не проверялся, потому что у меня нет образцов данных. Надеюсь, вы поймете суть этого.

Комментарии:

1. Я совершенно уверен, что ошибка в последних четырех строках, потому что заголовок был правильно написан во всех 29 файлах; в любом случае я постараюсь последовать вашему предложению…

2. Ваше предложение мне кажется прекрасным, но не совсем ясен второй момент, я имею в виду, как вы можете использовать пробелы в качестве ключа для итерации? Не могли бы вы привести небольшой пример? Ваше здоровье

3. Я просто отклонил это предложение. Если потребуется функция группировки с учетом состояния, что, вероятно, является ненужным усложнением в данный момент (поскольку вы уже близки).

4. да, но это все еще остается моей главной проблемой. моя самая большая проблема заключается в том, как сгруппировать их, чтобы впоследствии записать в файл

5. что было бы sta_counter в groupby?