У меня есть текстовый файл, содержащий формат, как показано ниже (я поместил часть текстового файла). В нем четыре колонки. Третий и четвертый столбцы - это имена файлов jpg. Например, третий и четвертый столбцы в первой строке представляют собой первый кадр и последний кадр, который имеет ассоциированное значение 83 во втором столбце.

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

Так как я не очень хорошо разбираюсь в python, я потерпел неудачу. Как я могу сделать это в Python?

Sub01/Scn1/Clr/rgb1 83 000001 000177
Sub02/Scn4/Clr/rgb1 1 000178 000218

Что я хочу:

Sub01/Scn1/Clr/rgb1 83 000001
Sub01/Scn1/Clr/rgb1 83 000002
...
Sub01/Scn1/Clr/rgb1 83 000117
Sub02/Scn4/Clr/rgb1 1  000178
Sub02/Scn4/Clr/rgb1 1  000179
...
-1
user8034918 3 Янв 2020 в 23:38

3 ответа

Пожалуйста, поделитесь своим подходом, чтобы мы могли помочь вам.

0
codeblooded 3 Янв 2020 в 23:46

Вы можете использовать модуль re для анализа значений (regex101), а затем форматирования строки чтобы получить результат:

data = '''Sub01/Scn1/Clr/rgb1 83 000001 000177
Sub02/Scn4/Clr/rgb1 1 000178 000218'''

import re

for val, _from, _to in re.findall(r'(.*?)(\d+)\s+(\d+)$', data, flags=re.M):
    for i in range(int(_from), int(_to) + 1):
        print('{}{:0{width}d}'.format(val, i, width=len(_from)))

Печать:

Sub01/Scn1/Clr/rgb1 83 000001
Sub01/Scn1/Clr/rgb1 83 000002
Sub01/Scn1/Clr/rgb1 83 000003
...
Sub01/Scn1/Clr/rgb1 83 000176
Sub01/Scn1/Clr/rgb1 83 000177
Sub02/Scn4/Clr/rgb1 1 000178
Sub02/Scn4/Clr/rgb1 1 000179
...
Sub02/Scn4/Clr/rgb1 1 000216
Sub02/Scn4/Clr/rgb1 1 000217
Sub02/Scn4/Clr/rgb1 1 000218

РЕДАКТИРОВАТЬ: Чтобы загрузить переменные из файла, вы можете использовать этот пример (template.txt содержит строку в формате из вашего вопроса):

import re

with open('template.txt', 'r') as f_in, open('output.txt', 'w') as f_out:
    for line in f_in:
        if line.strip() == '':    # skip empty lines
            continue
        for val, _from, _to in re.findall(r'(.*?)(\d+)\s+(\d+)$', line.strip()):
            for i in range(int(_from), int(_to) + 1):
                print('{}{:0{width}d}'.format(val, i, width=len(_from)), file=f_out)
1
Andrej Kesely 4 Янв 2020 в 00:39
Я ценю ваш ответ, но это не сработало! У меня есть большой текстовый файл, и я положил сюда только его часть. Итак, я хочу прочитать текстовый файл, и я сделал это, и это не удалось. Я читаю текстовый файл вроде data = open("template.txt","r")
 – 
user8034918
4 Янв 2020 в 00:03
После вашего нового редактирования я получаю следующее сообщение: WARNING: some intermediate output was truncated. WARNING: 159 intermediate output messages were discarded. Можно ли вместо этого вывести текстовый файл?
 – 
user8034918
4 Янв 2020 в 00:36
Да, я отредактировал свой ответ. теперь он производит output.txt вместо печати на экране.
 – 
Andrej Kesely
4 Янв 2020 в 00:40

Использование модуля CSV для разбора ввода, но запись вывода в формате txt

Входные данные: файл data.txt (допустим пробел между каждым полем)

Вывод: файл result.txt

import csv

with open('data.txt') as infile, open('result.txt', 'w') as outfile:
    readCSV = csv.reader(infile, delimiter=' ') # assume space between each field
    for row in readCSV:
        if row: # skip blank rows
            for i in range(int(row[2]), int(row[3])+1):
                # number of loops based upon values in columns 2 & 3
                # Create output string
                result = "{} {} {:06d}".format(row[0], row[1], i)
                outfile.write(result + "\n")

Вывод

Файл результатов.txt

Sub01/Scn1/Clr/rgb1 83 000001
Sub01/Scn1/Clr/rgb1 83 000002
Sub01/Scn1/Clr/rgb1 83 000003
Sub01/Scn1/Clr/rgb1 83 000004
Sub01/Scn1/Clr/rgb1 83 000005
Sub01/Scn1/Clr/rgb1 83 000006
Sub01/Scn1/Clr/rgb1 83 000007
Sub01/Scn1/Clr/rgb1 83 000008
Sub01/Scn1/Clr/rgb1 83 000009
Sub01/Scn1/Clr/rgb1 83 000010
Sub01/Scn1/Clr/rgb1 83 000011
...
2
DarrylG 4 Янв 2020 в 03:30
Спасибо за ответ, но третий (последний) столбец выходного файла не такой, каким должен быть!
 – 
user8034918
4 Янв 2020 в 03:20
@ user8034918 - забыл, что в третьем столбце ведущие нули. Простое изменение. Теперь это правильно?
 – 
DarrylG
4 Янв 2020 в 03:32