2

У меня есть файл для редактирования, в котором мне нужно что-то изменить. Мои знания Python очень просты. Это сэкономило бы мне часы копирования / вставки, если бы я нашел решение.

Мой файл содержит это:

002  AS       V     C        01:00:24:14 01:00:28:18 01:00:35:01 01:00:39:05 * FROM CLIP NAME: Sq3_Sh1.jpg
003  AS       V     C        01:00:39:05 01:00:42:23 01:00:39:05 01:00:42:23 * FROM CLIP NAME: Sq3_Sh4.jpg
004  AS       V     C        01:00:42:23 01:00:45:16 01:00:42:23 01:00:45:16 * FROM CLIP NAME: Sq3_Sh5.jpg
005  BA       V     C        00:00:00:00 00:00:05:20 01:00:45:16 01:00:51:12
006  AS       V     C        01:00:24:14 01:00:29:06 01:00:51:12 01:00:56:04 * FROM CLIP NAME: Sq3_Sh14.jpg
007  AS       V     C        01:00:56:04 01:00:59:10 01:00:56:04 01:00:59:10 * FROM CLIP NAME: Sq3_Sh6.jpg

Мне нужно сделать 2 вещи:

  1. Замените каждую AS на название клипа. Например Sq3_Sh6 (без расширения)

  2. Удалить каждую строку текста, которая содержит BA

Может кто-нибудь может помочь?

3 ответа3

1

Все довольно просто с хорошей утилитой регулярных выражений. Конечно, Python может справиться с этим, но JREPL.BAT может предоставить еще более простое решение. Это утилита, основанная исключительно на сценариях (гибридный JScript/batch), которая работает на любом компьютере с Windows. Просто скопируйте скрипт в папку, которая указана в вашем PATH.

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

Мои решения ниже предполагают, что вы хотите перезаписать исходный файл, назовите его test.txt, и у вас есть JREPL.BAT в папке, указанной в вашем PATH.

Если каждая строка является либо строкой AS, которую следует изменить и сохранить, либо строкой BA, которую следует отбросить, то все, что вам нужно, это следующее (я использовал продолжение строки ^ просто для облегчения чтения кода):

call jrepl "^(...  )AS      (.*FROM CLIP NAME: (.*?)\..*)$"^
           "$1+($3+'        ').slice(0,8)+$2"^
           /jmatch /f test.txt /o -

Если ваш ввод включает дополнительные строки, которые не являются AS или BA, которые должны быть сохранены, то вы можете использовать:

call jrepl "^(...  )AS      (.*FROM CLIP NAME: (.*?)\..*)$|^...  (?!BA).*$"^
           "$2+($4+'        ').slice(0,8)+$3|$0"^
           /t "|" /jmatch /f test.txt /o -

Полная документация встроена в JREPL.BAT.

0

Замена частей строки, используя Python, под Windows

Как я жажду быстрой однострочной игры bash 1. Однако этот скрипт должен делать то, что вы хотите, используя простое регулярное выражение для извлечения имени файла, а затем используя это в функции string.replace() .

Автор сценария:

#!/usr/bin/env python3
import sys, fileinput, re

if __name__ == "__main__" and len(sys.argv) > 1:
    rx = re.compile("(?:FROM CLIP NAME\:\ )([\w]+)\.jpg")
    for line in fileinput.input([sys.argv[1]], inplace=True, backup=".bak"):
            if not "BA" in line:
                    if "AS" in line:
                            m = rx.search(line)
                            if m:
                                    print(line.replace("AS", m.group(1)))
                    else:
                            print(line)

Сохранить как substitution.py (или как угодно) и запустить как:

 D:\project\images\>python substitution.py datafile.dat

где datafile.dat - это фактический файл, с которым вы хотите, чтобы скрипт работал. Сценарий создаст резервную копию исходного файла с именем datafile.dat.bak .

Предостережения и предположения

Это предполагает, что ваши строки заканчиваются FROM CLIP NAME: <filename.jpg> . Предполагается, что строки, содержащие BA , должны быть пропущены; и игнорирует любую строку, которая не содержит "AS".

Написан с python3 но работает с python2 ; протестировано 2.7.10 под Cygwin , 2.7.9 и 3.4.2 под Linux. Вероятно, очень хрупкий. Сделайте резервную копию файла перед использованием. Не получайте сценарий в глаза. в случае проглатывания обратиться за медицинской помощью. Может вызвать рак в штате Калифорния.

1 Или даже и «на месте заменить» с помощью re.sub() вздыхаю

0

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

with open('test.txt', 'rb') as f1:
    with open('result.txt', 'a') as f2:
        for line in f1:
            if 'BA' not in line:
                cols = line.split()
                clip = line.split(':')[-1].split('.')[0].strip()
                if cols[1] == 'AS':
                    cols[1] = clip
                f2.write('{0}\n'.format('\t'.join(cols)))

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .