Como criar e manipular arquivos de alcatrão usando python

Como criar e manipular arquivos de alcatrão usando python

No Linux e em outros sistemas operacionais do tipo UNIX, o TAR é sem dúvida um dos utilitários de arquivamento mais usados; Deixamos criar arquivos, geralmente chamados de "tarballs", podemos usar para fins de distribuição de código -fonte ou backup. Neste tutorial, veremos como ler, criar e modificar arquivos de alcatrão com python, usando o Tarfile módulo.

Neste tutorial, você aprenderá:

  • Os modos em que um arquivo alcatrão pode ser aberto usando o módulo Tarfile
  • Quais são as classes Tarinfo e Tarfile e o que eles representam
  • Como listar o conteúdo de um arquivo alcatrão
  • Como extrair o conteúdo de um arquivo alcatrão
  • Como adicionar arquivos a um arquivo alcatrão


Requisitos de software e convenções usadas

Requisitos de software e convenções de linha de comando Linux
Categoria Requisitos, convenções ou versão de software usada
Sistema Independente da distribuição
Programas Python3
Outro Conhecimento básico de Python3 e programação orientada a objetos
Convenções # - requer que os comandos Linux sejam executados com privilégios root diretamente como usuário root ou por uso de sudo comando
$ - Requer que os comandos do Linux sejam executados como um usuário não privilegiado regular

Uso básico

O Tarfile O módulo está incluído na biblioteca padrão do Python, por isso não precisamos instalá -lo separadamente; Para usá -lo, só precisamos "importá -lo. A maneira recomendada de acessar um tarball usando este módulo é pelo abrir função; Em seu uso mais básico, devemos fornecer, como os primeiros e os segundos argumentos:

  • O nome do tarball que queremos acessar
  • O modo em que deve ser aberto

O "modo" usado para abrir um arquivo alcatrão depende da ação que queremos executar e do tipo de compressão (se houver) em uso. Vamos vê -los juntos.

Abrindo um arquivo no modo somente leitura

Se quisermos examinar ou extrair o conteúdo de um arquivo TAR, podemos usar um dos modos a seguir, para abri-lo somente leitura:

Modo Significado
'r' Modo somente de leitura - o tipo de compressão será tratado automaticamente
'r:' Modo somente leitura sem compressão
'r: gz' Modo somente leitura - fecho eclair Compressão especificada explicitamente
'r: bz2' Modo somente leitura - bzip Compressão especificada explicitamente
'r: xz' Modo somente leitura - lzma Compressão especificada explicitamente

Na maioria dos casos, onde o método de compressão pode ser facilmente detectado, o modo recomendado para usar é 'r'.

Abrindo um arquivo para anexar arquivos

Se queremos anexar arquivos a um arquivo existente, podemos usar o 'a' modo. É importante notar que é possível anexar um arquivo apenas se não for comprimido; Se tentarmos abrir um arquivo comprimido com este modo, um ValueError Exceção será levantada. Se fizermos referência a um arquivo inexistente, ele será criado em tempo real.

Abrindo um arquivo para escrever

Se queremos criar explicitamente um novo arquivo e abri -lo para escrever, podemos usar um dos seguintes modos:

Modo Significado
'c' Abra o arquivo para escrever - não use compactação
'w: gz' Abra o arquivo para escrever - Use gzip compressão
'W: BZ' Abra o arquivo para escrever - Use BZIP2 compressão
'W: XZ' Abra o arquivo para escrever - Use lzma compressão

Se um arquivo de arquivo existente for aberto para escrever, é truncado, então todo o seu conteúdo é descartado. Para evitar tais situações, podemos querer abrir o arquivo exclusivamente, conforme descrito na próxima seção.

Crie um arquivo apenas se não existir

Quando queremos ter certeza de que um arquivo existente não é substituído ao criar um arquivo, devemos abri -lo exclusivamente. Se usarmos o 'x' modo e um arquivo com o mesmo nome do que especificamos para o arquivo já existe, um FileExistSerror será levantado. Os métodos de compactação podem ser especificados da seguinte forma:

Modo Significado
'x' Crie o arquivo sem compactação se não existir
'x: gz' Criar o arquivo com gzip compressão apenas se não existir
'x: bz2' Criar o arquivo com BZIP2 compressão apenas se não existir
'x: xz' Criar o arquivo com lzma compressão apenas se não existir

Trabalhando com arquivos

Existem duas classes fornecidas pelo Tarfile Módulo usado para interagir com arquivos alcaturinos e seu conteúdo, e são, respectivamente:: Tarfile e Tarinfo. O primeiro é usado para representar um arquivo alcatrão na íntegra e pode ser usado como um Gerente de contexto com o python com declaração, este último é usado para representar um membro do arquivo e contém várias informações sobre ele. Como primeiro passo, nos concentraremos em alguns dos métodos mais usados ​​do Tarfile Classe: podemos usá -los para executar operações comuns em arquivos alcaturinos.

Recuperando uma lista dos membros do arquivo

Para recuperar uma lista dos membros do arquivo, podemos usar o getMembers método de a Tarfile objeto. Este método retorna uma lista de Tarinfo objetos, um para cada membro do arquivo. Aqui está um exemplo de seu uso com um arquivo comprimido dummy contendo dois arquivos:

>>> com tarfile.Arquivo aberto.alcatrão.gz ',' r ') como arquivo: ... arquivo.getMembers () ... [[, ] 
cópia de

Como veremos mais adiante, podemos acessar alguns dos atributos de um arquivo arquivado, como seu tempo de propriedade e modificação, através do correspondente Tarinfo Propriedades e métodos do objeto.

Exibindo o conteúdo de um arquivo alcatrão

Se tudo o que queremos fazer é exibir o conteúdo de um arquivo alcatrão, podemos abri -lo no modo de leitura e usar o lista Método do Tarfile aula.

>>> com tarfile.Arquivo aberto.alcatrão.gz ',' r ') como arquivo: ... arquivo.lista() ... ?rw-r-r-- egdoc/egdoc 0 2020-05-16 15:45:45 file1.TXT ?rw-r-r-- egdoc/egdoc 0 2020-05-16 15:45:45 file2.TXT 
cópia de

Como você pode ver, a lista dos arquivos contidos no arquivo é exibida como saída. O lista Método aceita um parâmetro posicional, detalhado qual é Verdadeiro por padrão. Se mudarmos seu valor para Falso, Somente os nomes de arquivos serão relatados na saída, sem informações adicionais.

O método também aceita um parâmetro nomeado opcional, membros. Se usado, o argumento fornecido deve ser um subconjunto da lista de Tarinfo objetos conforme retornado pelo getMembers método. Somente informações sobre os arquivos especificados serão exibidos se este parâmetro for usado e um valor correto for fornecido.

Extraindo todos os membros do arquivo alcatrão

Outra operação muito comum que queremos executar em um arquivo alcatrão é extrair todo o seu conteúdo. Para executar essa operação, podemos usar o extrair tudoMétodo do correspondente Tarfile objeto. Aqui está o que escrevíamos:

>>> com tarfile.Arquivo aberto.alcatrão.gz ',' r ') como arquivo: ... arquivo.extrair tudo() 
cópia de

O primeiro parâmetro aceito pelo método é caminho: costumava especificar onde os membros do arquivo devem ser extraídos. o valor padrão é '.', Portanto, os membros são extraídos no diretório de trabalho atual.

O segundo parâmetro, membros, pode ser usado para especificar um subconjunto de membros para extrair do arquivo e, como no caso do lista método, deve ser um subconjunto da lista retornada pelo getMembers método.

O extrair tudo o método também tem um parâmetro nomeado, numeric_owner. Isso é Falso por padrão: se mudarmos para Verdadeiro, numérico uid e Gid será usado para definir a propriedade dos arquivos extraídos em vez de nomes de usuários e grupos.

Extraindo apenas um membro do arquivo

E se quisermos extrair apenas um único arquivo do arquivo? Nesse caso, queremos usar o extrair método e referência ao arquivo que deve ser extraído por seu nome (ou como um Tarfile objeto). Por exemplo, para extrair apenas o arquivo1.TXT Arquivo do Tarball, nós executaríamos:

>>> com tarfile.Arquivo aberto.alcatrão.gz ',' r ') como arquivo: ... arquivo.Extract ('arquivo1.TXT') 
cópia de

Fácil, não é? O arquivo é extraído no diretório de trabalho atual por padrão, mas uma posição diferente pode ser especificada usando o segundo parâmetro aceito pelo método: caminho.

Normalmente, os atributos que o arquivo possui no arquivo são definidos quando é extraído no sistema de arquivos; Para evitar esse comportamento, podemos definir o terceiro parâmetro da função, set_attrs, para Falso.

O método aceita também o numeric_owner Parâmetro: o uso é o mesmo que vimos no contexto do extrair tudo método.

Extraindo um membro do arquivo como um objeto semelhante a um arquivo

Vimos como, usando o extrair tudo e extrair Métodos, podemos extrair um ou vários membros do Archive para o sistema de arquivos. O Tarfile O módulo fornece outro método de extração: Extrair arquivo. Quando esse método é usado, o arquivo especificado não é extraído no sistema de arquivos; Em vez disso, um objeto de arquivo somente para leitura que representa é devolvido:

>>> com tarfile.Arquivo aberto.alcatrão.gz ',' r ') como arquivo: ... FILEOBJ = Arquivo.ExtractFile ('File1.TXT') ... FileObj.gravável () ... FileObj.ler() ... False b'hello \ nworld \ n ' 
cópia de

Adicionando arquivos a um arquivo

Até agora, vimos como obter informações sobre um arquivo e seus membros e os diferentes métodos que podemos usar para extrair seu conteúdo; Agora é hora de ver como podemos adicionar novos membros.

A maneira mais fácil que podemos usar para adicionar um arquivo a um arquivo é usando o adicionar método. Referenciamos o arquivo a ser incluído no arquivo por nome, que é o primeiro parâmetro aceito pelo método. O arquivo será arquivado com seu nome original, a menos que especifique uma alternativa usando o segundo parâmetro posicional: arcname. Suponha que queremos adicionar o arquivo1.TXT para um novo arquivo, mas queremos armazená -lo como Archived_File1.TXT; nós escrevíamos:

>>> com tarfile.aberto ('new_archive.alcatrão.gz ',' w ') como arquivo: ... arquivo.add ('file1.txt ',' archived_file1.TXT') ... arquivo.lista() ... -RW-R-R-- EGDOC/EGDOC 12 2020-05-16 17:49:44 arquivado_file1.TXT 
cópia de

No exemplo acima, criamos um novo arquivo não compactado usando o 'c' modo e adicionou o arquivo1.TXT como archive_file1.TXT, Como você pode ver pela saída de lista().

Os diretórios podem ser arquivados da mesma maneira: por padrão, são adicionados recursivamente, portanto, juntamente com seu conteúdo. Este comportamento pode ser alterado definindo o terceiro parâmetro posicional aceito pelo adicionar método, recursivo, para Falso.

E se quisermos aplicar um filtro, para que apenas arquivos especificados sejam incluídos no arquivo? Para esse fim, podemos usar o opcional filtro parâmetro nomeado. O valor passado para este parâmetro deve ser uma função que leva um Tarinfo objeto como argumento e retorno dizia o objeto se deve ser incluído no arquivo ou Nenhum Se deve ser excluído. Vamos ver um exemplo. Suponha que tenhamos três arquivos em nosso diretório de trabalho atual: arquivo1.TXT, File2.TXT e arquivo1.MD. Queremos adicionar apenas os arquivos com o .TXT extensão ao arquivo; Aqui está o que poderíamos escrever:

>>> importar os >>> importar tarfile >>> com tarfile.aberto ('new_archive.alcatrão.gz ',' w ') como arquivo: ... para i em os.listdir (): ... arquivo.add (i, filtro = lambda x: x se x.nome.termina com('.txt ') mais nenhum) ... arquivo.lista() ... -rw-r-r-- egdoc/egdoc 0 2020-05-16 18:26:20 file2.txt -rw-r--r-- egdoc/egdoc 0 2020-05-16 18:22:13 file1.TXT 
cópia de

No exemplo acima, usamos o OS.ListDir Método para obter uma lista dos arquivos contidos no diretório de trabalho atual. Iterando a referida lista, usamos o adicionar método para adicionar cada arquivo ao arquivo. Passamos uma função como o argumento do filtro parâmetro, neste caso um anônimo, um Lambda. A função pega o objeto Tarfile como argumento (x) e o retorna se seu nome (o nome for uma das propriedades do Tarinfo objeto) termina com “.TXT". Se não for o caso, a função retorna Nenhum Portanto, o arquivo não está arquivado.

O objeto Tarinfo

Já aprendemos que o Tarinfo Objetos representa um membro do Arquivo TAR: ele armazena os atributos do arquivo referenciado e fornece alguns métodos que podem nos ajudar a identificar o próprio tipo de arquivo. O Tarinfo O objeto não contém os dados reais do arquivo. Alguns dos atributos do Tarinfo objeto são:

  • nome (nome do arquivo)
  • tamanho (tamanho do arquivo)
  • Mtime (tempo de modificação do arquivo)
  • UID (o ID do usuário do proprietário do arquivo)
  • GID (o ID do grupo de arquivos)
  • uname (o nome de usuário do proprietário do arquivo)
  • GNAME (o nome do grupo de arquivos)

O objeto também tem alguns métodos muito úteis, aqui estão alguns deles:

  • isfile () - retorna true se o arquivo for um arquivo regular, false caso contrário
  • iSdir () - retorna true se o arquivo for um diretório, false caso contrário
  • ISSYM () - Retorna true se o arquivo for um link simbólico, falso caso contrário
  • isblk () - retorna true se o arquivo for um dispositivo de bloco, false caso contrário

Conclusões

Neste tutorial, aprendemos o uso básico do Tarfile Módulo Python, e vimos como podemos usá -lo para funcionar com arquivos alcaturinos. Vimos os vários modos de operação, o que o Tarfile e Tarinfo As classes representam, e alguns dos métodos mais usados ​​para listar o conteúdo de um arquivo, para adicionar novos arquivos ou extraí -los. Para um conhecimento mais profundo do Tarfile Módulo, por favor, dê uma olhada na documentação oficial do módulo

Tutoriais do Linux relacionados:

  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Coisas para instalar no Ubuntu 20.04
  • Mastering Bash Script Loops
  • Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
  • Loops aninhados em scripts de basquete
  • Ubuntu 22.04 Backup e restauração do sistema
  • Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
  • Como criar backups incrementais e diferenciais com alcatrão
  • Como criar e extrair arquivos do CPIO em exemplos de Linux
  • Introdução ao backup de Borg