Mass encontrar / substituir no arquivo usando python

2

Eu tenho um arquivo de edição no qual preciso alterar algumas coisas. Meu conhecimento de python é muito básico. Isso me pouparia horas de copiar / colar se eu encontrasse uma solução.

Meu arquivo contém isto:

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

Eu preciso fazer duas coisas:

  1. Substitua cada AS pelo nome do clipe. Por exemplo, Sq3_Sh6 (sem a extensão)

  2. Exclua todas as linhas de texto que contêm BA

Talvez alguém possa ajudar?

    
por Fabian ESH 25.08.2015 / 21:35

3 respostas

1

As coisas são muito fáceis com um bom utilitário de expressões regulares. Certamente python pode lidar com isso, mas JREPL.BAT pode fornecer uma solução ainda mais simples . É um utilitário baseado em script puro (JScript / batch híbrido) que é executado nativamente em qualquer máquina Windows. Simplesmente copie o script para uma pasta listada no seu PATH.

Suponho que cada nome de arquivo tenha < = 8 caracteres de comprimento e você deseja preservar o alinhamento da coluna existente em cada linha de saída.

Minhas soluções abaixo assumem que você deseja sobrescrever o arquivo original, chamá-lo test.txt e você tem o JREPL.BAT em uma pasta listada em seu PATH.

Se cada linha for uma linha AS que deve ser modificada e preservada, ou uma linha BA que deve ser eliminada, tudo o que você precisa é o seguinte (usei continuação de linha ^ apenas para facilitar a leitura do código ):

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

Se sua entrada incluir linhas adicionais que não sejam AS ou BA que devem ser preservadas, você poderá usar:

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

A documentação completa está incorporada no JREPL.BAT.

    
por 26.08.2015 / 04:59
0

Substituindo partes de uma linha, usando Python, no Windows

Como anseio por uma rápida bash one-liner 1 . No entanto, esse script deve fazer o que você deseja usando uma regex simples para extrair o nome do arquivo e usá-lo na função string.replace() .

Script:

#!/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)

Salvar como substitution.py (ou qualquer outro) e executar como:

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

em que datafile.dat é o arquivo real no qual você deseja que o script funcione. O script criará um backup do arquivo original chamado datafile.dat.bak .

Advertências e suposições

Isso pressupõe que suas linhas terminem com FROM CLIP NAME: <filename.jpg> . Assume que linhas contendo BA devem ser omitidas; e ignora qualquer linha que não contenha "AS".

Escrito com python3 em mente, mas funciona com python2 ; testou 2.7.10 em Cygwin , 2.7.9 e 3.4.2 no Linux. Provavelmente altamente frágil . Faça o backup do arquivo antes de usar. Não receba script nos olhos. se ingerido, procure assistência médica. Pode causar câncer no estado da Califórnia.

1 Ou até mesmo e "substituir no local" usando re.sub() suspiro

    
por 25.08.2015 / 22:47
0

Você pode considerar o seguinte código, apenas uma demonstração simples, que não gerou nenhum erro possível.

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)))
    
por 25.08.2015 / 22:53