Como Copiar um Arquivo em Python

Introdução

Quando se trata de utilizar o Python para copiar arquivos, existem duas principais maneiras: usando o shutil módulo ou os módulo. Todos os métodos que mostramos aqui são métodos que nos permitem executar comandos shell do nosso código Python, que usaremos para executar o comando copy (Windows) ou o comando cp (Unix).

Você vai notar que muitos destes métodos, tanto no móduloshutil e no móduloos, têm funcionalidades muito semelhantes (o que não deve ser surpreendente), mas cada uma varia em funcionalidade entre si muito ligeiramente, o que eu vou explicar também.

copiar ficheiros com o módulo shutil

o módulo shutil oferece vários métodos de alto nível para copiar ficheiros. Aqui estão as principais:

copyfile

este método copia o conteúdo de um ficheiro para outro ficheiro. O destino fornecido a ele deve ser um arquivo writable, e ter um nome diferente do arquivo de origem. Se os nomes são os mesmos, então ele irá gerar um erro. Se o ficheiro de destino já existir, será substituído pelo Ficheiro Novo copiado.

a sintaxe para este método é:

por exemplo, o seguinte código irá copiar um ficheiro chamado ” file1.txt em um arquivo chamado ” file2.txt”:

import shutilshutil.copyfile('file1.txt', 'file2.txt')

Uma interessante e potencialmente útil recurso de shutil.copyfile é o follow_symlinks argumento Booleano. Se ele for definido para False, e o arquivo fonte é um link simbólico, então em vez de copiar o arquivo, um novo link simbólico será criado.

copiar

Este método é muito semelhante ao copyfile, com a principal diferença de que, além de copiar o conteúdo do arquivo de origem, vai um passo além e também copia o arquivo do sistema de arquivos permissões. Copiar as permissões de arquivos não é uma tarefa trivial na maioria das linguagens de programação, então esta é uma boa característica a ter.

a sintaxe é a seguinte::

shutil.copy(src_file, dest_file, *, follow_symlinks=True)

cada um destes parâmetros é o mesmo que no métodocopyfile. Por exemplo, o seguinte código irá copiar “file1.TXT ” em ” file3.txt”.

Nota: Certifique-se de que não nomeia o seu programa como um do módulo que está a importar (o que fiz erradamente ao testar o código para este artigo). Se o fizer, então irá obter um erro ao tentar importar esse módulo devido a um problema circular de importação.

copy2

Como com os métodos anteriores, copy2 método é idêntico ao copy método, mas, além de copiar o conteúdo do arquivo, ele também tenta preservar todos os metadados do arquivo. Se a plataforma não permite a gravação completa de meta-dados, então copy2 não devolve a falha e apenas preserva qualquer meta-dados que possa.

A sintaxe é a seguinte:

shutil.copy2(src_file, dest_file, *, follow_symlinks=True)

novamente, estes parâmetros são os mesmos que nos comandos anteriores que mencionamos até agora.

Por exemplo, o seguinte código irá copiar ” file1.txt ” em ” file4.txt”, bem como preservar os metadados do arquivo original, ” file1.txt”.

import shutilshutil.copy2('file1.txt', 'file4.txt')
$ python copy-files.py $ ls -ltotal 32-rw-r--r-- 1 scott staff 91 Oct 27 11:26 copy-files.py-rw-r--r-- 1 scott staff 6 Oct 27 11:27 file1.txt-rw-r--r-- 1 scott staff 6 Oct 27 11:29 file3.txt-rw-r--r-- 1 scott staff 6 Oct 27 11:27 file4.txt

Como podemos ver a partir da execução do nosso código acima, “file1.txt foi copiado para ” file4.txt”. No entanto, você pode ter notado que a data de criação foi preservada no novo arquivo, ao contrário de shutil.copy, que copiou “file1.TXT “para” file3.txt ” e deu-lhe uma nova data de criação.

copyfileobj

este método copia o conteúdo de um ficheiro de código para um ficheiro de destino, a partir da posição actual do ficheiro de código. O que isso significa é que se você ler dados do seu objeto de arquivo de origem, então a posição em que você parar de ler é a posição copyfileobj começa a copiar.

a sintaxe é a seguinte:

shutil.copyfileobj(src_file_object, dest_file_object)

os significados dos parâmetros dos ficheiros de origem e destino são semelhantes aos comandos anteriores, mas agora, referem-se a objectos. O parâmetro comprimento é opcional e representa o tamanho do buffer que é o número de mordidas mantidas na memória durante o processo de cópia. Esta opção pode ser útil ao copiar arquivos muito grandes, pois pode acelerar o processo de cópia e evitar o uso descontrolado de memória.

Por exemplo, o seguinte código irá copiar ” file1.txt ” em ” file5.txt”

import shutilfilename1 = 'file1.txt'fileA = open(filename1, 'rb')filename2 = 'file5.txt'fileB = open(filename2, 'wb')shutil.copyfileobj(fileA, fileB)

Como podemos ver, a fim de usar copyfileobj, precisamos abrir os arquivos em modo binário (que é o “b” parte “rb” e “wb”). Além disso, o arquivo fonte deve ser aberto como legível e o arquivo de destino deve ser aberto como writable (as partes “r” E “w”, respectivamente).

copiar ficheiros com o módulo de SO

o módulo de SO Oferece uma forma de usar a funcionalidade do sistema operativo para copiar os seus ficheiros. Na maioria (se não todos) dos exemplos a partir de Agora, nós fornecemos exemplos que funcionam tanto para Windows quanto Para Unix. Os exemplos são diferentes por causa dos comandos shell usados, por isso não se esqueça de prestar atenção a como cada chamada de função é rotulada nos comentários Python.

popen

este método abre um tubo de ou para o seu comando. No entanto, note que este método foi depreciado no Python 2.6, por isso não recomendamos usá-lo a menos que você tenha que fazê-lo. Em alternativa, a documentação Python aconselha-nos a usar métodos do módulo de subprocessamento.

A sintaxe é a seguinte:

os.popen(cmd])

Aqui o valor devolvido é um objeto de arquivo que está conectado ao pipe. Este objeto pode ser lido de ou escrito Para dependendo do modo. O modo padrão é ‘r’, que permite a leitura do conteúdo do arquivo.

o exemplo abaixo irá copiar ” file1.txt ” em ” file6.txt”:

import os# Windowsos.popen('copy file1.txt file6.txt')# Unixos.popen('cp file1.txt file6.txt')

executar o comando desta forma é exactamente o mesmo que se o executasse directamente a partir da linha de comandos do seu terminal.

system

este método executa o comando especificado numa sub-estrutura. Ele está disponível tanto para Unix quanto para Windows. A sintaxe é a seguinte:

os.system(command)

Aqui command é uma string contendo o comando DOS ou shell Unix. No nosso caso, é aqui que vamos colocar o comando copy ou cp.

Por exemplo, o seguinte código irá copiar ” file1.txt ” em ” file7.txt”

import os# Windowsos.system('copy file1.txt file7.txt')# Unixos.system('cp file1.txt file7.txt')

Isso parece idêntico ao anterior os.popen comando usamos somente, mas o comando é executado em um sub-shell, o que significa que ele é executado em uma thread separada em paralelo ao executar o código. Para esperar pela sua conclusão, você precisa chamar .wait() no objeto devolvido por os.system.

Copiar Ficheiros com o subprocesso Módulo

O subprocesso módulo tem a intenção de substituir alguns métodos de os módulo (particularmente os.system e o os.spawn* métodos), e apresenta dois principais métodos para acessar os comandos do sistema operacional. Estes métodos são call e check_output. Mais uma vez, para sistemas Unix, o comando “copy file1.txt file2.txt “deve ser substituído por” CP file1.txt file2.txt”.

método de chamada

a documentação em Python recomenda que usemos o método call para lançar um comando a partir do sistema operacional.

a sintaxe é a seguinte:

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

o parâmetro args incluirá o nosso comando shell. No entanto, uma palavra de cautela, como a documentação Python nos adverte que o uso de shell=True pode ser um risco de segurança.

Usando esta chamada de função, podemos executar o nosso comando de cópia como se segue:

import subprocess# Windowsstatus = subprocess.call('copy file1.txt file8.txt', shell=True)# Unixstatus = subprocess.call('cp file1.txt file8.txt', shell=True)

Como o exemplo acima mostra, simplesmente precisamos passar uma string com o comando shell, como antes.

e como esperado, o sistema operacional copiará ” file1.txt em um arquivo chamado ” file8.txt”.

método de check_ output

este método também nos permite executar um comando dentro de uma linha de comandos. It is very much like the subprocess.run command, except that by default it pipes data from stdout as encoded bytes. A sintaxe é a seguinte::

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)

Aqui o parâmetroargs inclui o comando shell que queremos usar. Mais uma vez, a documentação Python nos adverte de usar shell=True, então use este método com cuidado.

no seguinte código nós copiaremos ” file1.txt “para” file9.txt” usando o check_output comando:

import subprocess# Windowsstatus = subprocess.check_output('copy file1.txt file9.txt', shell=True)# Unixstatus = subprocess.check_output('cp file1.txt file9.txt', shell=True)

E, como todos os comandos que mostramos neste artigo, isso irá copiar o arquivo “arquivo1.txt “para o destino que especificamos, que é” file9.txt ” aqui.

encerrar

Python oferece-nos muitas maneiras diferentes de copiar ficheiros, alguns dos quais fazem parte do conjunto de métodos Python. Outros usam alguns dos métodos powerfull do Python para executar comandos em uma shell, que utilizam comandos shell como copy ou cp.não tens a certeza de qual é a melhor para ti? Nós apresentamos muitas maneiras diferentes de copiar arquivos aqui, então isso é compreensível. O método que você usa para copiar um arquivo é completamente até você e vai depender de suas necessidades específicas. Embora na maioria dos casos um dos comandos shutil funcionará muito bem para si. Tente começar com shutil.copy2 e veja se isso faz o que você precisa.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *