imprimir - manejo de archivos y carpetas en python
¿Cómo copio un archivo en Python? (14)
¿Cómo copio un archivo en Python?
No pude encontrar nada bajo os
Copiar un archivo es una operación relativamente sencilla como se muestra en los ejemplos a continuación, pero en su lugar, debe usar el módulo shutil stdlib para eso.
def copyfileobj_example(source, dest, buffer_size=1024*1024):
"""
Copy a file from source to dest. source and dest
must be file-like objects, i.e. any object with a read or
write method, like for example StringIO.
"""
while True:
copy_buffer = source.read(buffer_size)
if not copy_buffer:
break
dest.write(copy_buffer)
Si desea copiar por nombre de archivo, podría hacer algo como esto:
def copyfile_example(source, dest):
# Beware, this example does not handle any edge cases!
with open(source, ''rb'') as src, open(dest, ''wb'') as dst:
copyfileobj_example(src, dst)
Ejemplo de copia de directorio y archivo - De Tim Golden''s Python Stuff:
http://timgolden.me.uk/python/win32_how_do_i/copy-a-file.html
import os
import shutil
import tempfile
filename1 = tempfile.mktemp (".txt")
open (filename1, "w").close ()
filename2 = filename1 + ".copy"
print filename1, "=>", filename2
shutil.copy (filename1, filename2)
if os.path.isfile (filename2): print "Success"
dirname1 = tempfile.mktemp (".dir")
os.mkdir (dirname1)
dirname2 = dirname1 + ".copy"
print dirname1, "=>", dirname2
shutil.copytree (dirname1, dirname2)
if os.path.isdir (dirname2): print "Success"
En Python, puedes copiar los archivos usando
- módulo de
shutil
- módulo
os
- módulo de
subprocess
import os
import shutil
import subprocess
1) Copiando archivos usando el módulo shutil
firma docs.python.org/3/library/shutil.html#shutil.copyfile
shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copyfile(''source.txt'', ''destination.txt'')
firma shutil.copy
shutil.copy(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copy(''source.txt'', ''destination.txt'')
firma shutil.copy2
shutil.copy2(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copy2(''source.txt'', ''destination.txt'')
firma shutil.copyfileobj
shutil.copyfileobj(src_file_object, dest_file_object[, length])
# example
file_src = ''source.txt''
f_src = open(file_src, ''rb'')
file_dest = ''destination.txt''
f_dest = open(file_dest, ''wb'')
shutil.copyfileobj(f_src, f_dest)
2) Copiando archivos usando el módulo os
firma os.popen
os.popen(cmd[, mode[, bufsize]])
# example
# In Unix/Linux
os.popen(''cp source.txt destination.txt'')
# In Windows
os.popen(''copy source.txt destination.txt'')
firma os.system
os.system(command)
# In Linux/Unix
os.system(''cp source.txt destination.txt'')
# In Windows
os.system(''copy source.txt destination.txt'')
3) Copiando archivos utilizando módulo de subprocess
firma subprocess.call
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
# example (WARNING: setting `shell=True` might be a security-risk)
# In Linux/Unix
status = subprocess.call(''cp source.txt destination.txt'', shell=True)
# In Windows
status = subprocess.call(''copy source.txt destination.txt'', shell=True)
firma subprocess.check_output
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
# example (WARNING: setting `shell=True` might be a security-risk)
# In Linux/Unix
status = subprocess.check_output(''cp source.txt destination.txt'', shell=True)
# In Windows
status = subprocess.check_output(''copy source.txt destination.txt'', shell=True)
En primer lugar, hice una lista exhaustiva de métodos de cierre para su referencia.
shutil_methods =
{''copy'':[''shutil.copyfileobj'',
''shutil.copyfile'',
''shutil.copymode'',
''shutil.copystat'',
''shutil.copy'',
''shutil.copy2'',
''shutil.copytree'',],
''move'':[''shutil.rmtree'',
''shutil.move'',],
''exception'': [''exception shutil.SameFileError'',
''exception shutil.Error''],
''others'':[''shutil.disk_usage'',
''shutil.chown'',
''shutil.which'',
''shutil.ignore_patterns'',]
}
En segundo lugar, explicar los métodos de copia en ejemplos:
shutil.copyfileobj(fsrc, fdst[, length])
manipula objetos abiertos
In [3]: src = ''~/Documents/Head+First+SQL.pdf''
In [4]: dst = ''~/desktop''
In [5]: shutil.copyfileobj(src, dst)
AttributeError: ''str'' object has no attribute ''read''
#copy the file object
In [7]: with open(src, ''rb'') as f1,open(os.path.join(dst,''test.pdf''), ''wb'') as f2:
...: shutil.copyfileobj(f1, f2)
In [8]: os.stat(os.path.join(dst,''test.pdf''))
Out[8]: os.stat_result(st_mode=33188, st_ino=8598319475, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067347, st_mtime=1516067335, st_ctime=1516067345)
shutil.copyfile(src, dst, *, follow_symlinks=True)
Copie y cambie el nombre
In [9]: shutil.copyfile(src, dst)
IsADirectoryError: [Errno 21] Is a directory: ~/desktop''
#so dst should be a filename instead of a directory name
shutil.copy()
Copia sin prever los metadatos
In [10]: shutil.copy(src, dst)
Out[10]: ~/desktop/Head+First+SQL.pdf''
#check their metadata
In [25]: os.stat(src)
Out[25]: os.stat_result(st_mode=33188, st_ino=597749, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516066425, st_mtime=1493698739, st_ctime=1514871215)
In [26]: os.stat(os.path.join(dst, ''Head+First+SQL.pdf''))
Out[26]: os.stat_result(st_mode=33188, st_ino=8598313736, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516066427, st_mtime=1516066425, st_ctime=1516066425)
# st_atime,st_mtime,st_ctime changed
shutil.copy2()
Copia con previsualización de los metadatos
In [30]: shutil.copy2(src, dst)
Out[30]: ~/desktop/Head+First+SQL.pdf''
In [31]: os.stat(src)
Out[31]: os.stat_result(st_mode=33188, st_ino=597749, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067055, st_mtime=1493698739, st_ctime=1514871215)
In [32]: os.stat(os.path.join(dst, ''Head+First+SQL.pdf''))
Out[32]: os.stat_result(st_mode=33188, st_ino=8598313736, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067063, st_mtime=1493698739, st_ctime=1516067055)
# Preseved st_mtime
- `shutil.copytree ()` `
Copie recursivamente un árbol de directorios completo enraizado en src, devolviendo el directorio de destino
Mira el módulo shutil . Contiene la función de archivo de copia ( src , dst )
Para archivos grandes, lo que hice fue leer línea por línea y leer cada línea en una matriz. Luego, una vez que la matriz haya alcanzado un cierto tamaño, agréguela a un archivo nuevo.
for line in open("file.txt", "r"):
list.append(line)
if len(list) == 1000000:
output.writelines(list)
del list[:]
Podría usar os.system(''cp nameoffilegeneratedbyprogram /otherdirectory/'')
o como lo hice yo,
os.system(''cp ''+ rawfile + '' rawdata.dat'')
donde rawfile
es el nombre que había generado dentro del programa.
Esta es una solución solo para Linux
Puede usar una de las funciones de copia del paquete shutil
:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Function preserves supports accepts copies other permissions directory dest. file obj metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― shutil.copy ✔ ✔ ☐ ☐ shutil.copy2 ✔ ✔ ☐ ✔ docs.python.org/3/library/shutil.html#shutil.copyfile ☐ ☐ ☐ ☐ shutil.copyfileobj ☐ ☐ ✔ ☐ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Ejemplo:
import shutil
shutil.copy(''/etc/hostname'', ''/var/tmp/testhostname'')
Sugiero usar Swati''s respuesta Swati''s , pero suponiendo que tenga un archivo de texto y no quiera usar bibliotecas adicionales en su código para copiarlo, puede usar la siguiente frase de una línea:
with open(source, ''r'') as src, open(dest, ''w'') as dst: dst.write(src.read())
Utilice el shutil .
copyfile(src, dst)
Copie el contenido del archivo llamado src a un archivo llamado dst. La ubicación de destino debe ser escribible; de lo contrario, se generará una excepción IOError. Si dst ya existe, será reemplazado. Los archivos especiales como los dispositivos de caracteres o bloques y las tuberías no se pueden copiar con esta función. src y dst son nombres de ruta dados como cadenas.
Eche un vistazo a los filesys de archivos para todas las funciones de manejo de archivos y directorios disponibles en los módulos estándar de Python.
shutil
tiene muchos métodos que puedes usar. Uno de los cuales es:
from shutil import copyfile
copyfile(src, dst)
Copie el contenido del archivo llamado src
a un archivo llamado dst
. La ubicación de destino debe ser escribible; de lo contrario, se generará una excepción IOError
. Si dst
ya existe, será reemplazado. Los archivos especiales como los dispositivos de caracteres o bloques y las tuberías no se pueden copiar con esta función. src
y dst
son nombres de ruta dados como cadenas.
copy2(src,dst)
suele ser más útil que copyfile(src,dst)
porque:
- permite que
dst
sea un directorio (en lugar del nombre de archivo de destino completo), en cuyo caso se utiliza el basename desrc
para crear el nuevo archivo; - conserva la modificación original y la información de acceso (mtime y atime) en los metadatos del archivo (sin embargo, esto conlleva una ligera sobrecarga).
Aquí hay un breve ejemplo:
import shutil
shutil.copy2(''/src/dir/file.ext'', ''/dst/dir/newname.ext'') # complete target filename given
shutil.copy2(''/src/file.ext'', ''/dst/dir'') # target filename is /dst/dir/file.ext
┌──────────────────┬───────────────┬──────────────────┬──────────────┬───────────┐
│ Function │Copies metadata│Copies permissions│Can use buffer│Dest dir OK│
├──────────────────┼───────────────┼──────────────────┼──────────────┼───────────┤
│shutil.copy │ No │ Yes │ No │ Yes │
│shutil.copyfile │ No │ No │ No │ No │
│shutil.copy2 │ Yes │ Yes │ No │ Yes │
│shutil.copyfileobj│ No │ No │ Yes │ No │
└──────────────────┴───────────────┴──────────────────┴──────────────┴───────────┘
from subprocess import call
call("cp -p <file> <file>", shell=True)