Como criar e manipular arquivos de alcatrão usando python
- 3894
- 1134
- Enrique Gutkowski PhD
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
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 tudo
Mé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