elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [SOURCE] Cortador de Archivos hecho en Python!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [SOURCE] Cortador de Archivos hecho en Python!  (Leído 9,401 veces)
Shrick

Desconectado Desconectado

Mensajes: 259


Yo no se nada, sino ¿porque pregunto?


Ver Perfil
[SOURCE] Cortador de Archivos hecho en Python!
« en: 2 Julio 2008, 13:10 pm »

Estoy intentado programar un sencillo cortador de archivos de la manera siguiente:

1º Cojo un archivo cualquiera, estoy probando con un archivo llamado "prueba.jpg".

2º Abro el buffer (zona de la memoria temporal donde se pueden modificar datos de un archivo) del archivo "prueba.jpg" en modo binario y lectura, porque no nos interesa escribir en ella.

3º Creamos un bucle que mientras sea verdadero (true) que haga leer X bytes del archivo original ("prueba.jpg") y los copie el contenido leido en un archivo "prueba.jpg.0", continua el bucle y va creando "prueba.jpg.1", "prueba.jpg.2" y asi sucesivamente hasta que no haya más datos, y entonces se cierra el bucle y se cierra el buffer del archivo.

Funcionamiento:

Código
  1. python cortador.py archivo_origen tamaño destino

El tamaño se mide en Bytes para máxima precisión, si quieres una calculadora:

_http://www.terra.es/personal2/pagina_de_fuika/byteconvert.htm

Ejemplos:

Para Linux y similares:

Código
  1. python cortador.py "/home/shrick/archivo.jpg" 102400 "/home/shrick/carpeta_trozos"

Para Windows:

Código
  1. C:\Python25\python.exe "C:\Documents and Settings\Administrador\Escritorio\cortador.py" 102400 "C:\Documents and Settings\Administrador\Escritorio\carpeta_trozos"

Source Code:

Código
  1. # -*- coding: cp1252 -*-
  2. # Cortador by Shrick
  3. # Gracias a Google y Documentación de Python
  4. # Agradecimientos a http://www.elhacker.net, en especial a Novlucker
  5.  
  6. import string
  7. import os
  8. import sys
  9.  
  10. ruta = sys.argv[1] # Archivo a dividir
  11. nombre_archivo = os.path.basename(ruta) # Obtener nombre real del archivo
  12. tamano_trozo = sys.argv[2] # Tamaño de los trozos (Bytes xDDDD)
  13. destino = sys.argv[3] # Destino de los Trozos
  14. destino2 = destino
  15. tamano_trozo = int(tamano_trozo) # Pasamos argumento de String a Integer
  16. tamano = os.path.getsize(ruta) # Tamaño del Archivo (Bytes)
  17. print "Tamaño: " + repr(tamano) + " Bytes\n\nParticionando Archivo, por favor espere..." # Imprimir Tamaño del Archivo (Bytes)
  18. datos = '' # Datos del buffer
  19. posicion = 0 # Para posicionarse en los datos a leer
  20. i = 0 # Para Hacer .0, .1, .2, .3, .4, etc...
  21. f = open (ruta, 'rb') # Abrimos archivo
  22. while posicion <= tamano: # Creamos bucle que diga que si posicion menor o igual que tamaño hago lo que esta a continuación
  23.    destino = destino + nombre_archivo + "." + repr(i) # Crear nombre del archivo prueba.jpg.0, prueba.jpg.1, prueba.jpg.*
  24.    print "Creado: " + destino
  25.    j = open (destino, 'wb') # Creamos el archivo prueba.jpg.*
  26.    if i == 0: # Condicional para leer el bloque inicial
  27.        datos = f.read(tamano_trozo) # Datos toma lo leido del buffer
  28.        j.write(datos) # Escribimos en el archivo.
  29.        j.close() # Cerramos archivo
  30.        posicion = tamano_trozo # Metemos la posición siguiente en la integer
  31.        i = i + 1 # Sumamos 1 a la variable integer
  32.    else:
  33.        f.seek (posicion) # Función que va al byte con el valor de posición
  34.        datos = f.read(tamano_trozo) # Poner datos (X bytes de info.) en la variable desde esa posición
  35.        j.write(datos) # Escribimos en archivo
  36.        posicion = posicion + tamano_trozo # Vamos una posicion más avanzada
  37.        j.close() # Cerramos archivo
  38.        i = i + 1 # Sumamos 1 a la variable integer
  39.    destino = destino2
  40. f.close() # Cerramos archivo principal
  41.  
  42. x = open (destino2 + nombre_archivo + ".bat", 'w') # A partir de aquí creamos el .bat para pegar archivos
  43. x.write('copy /b "'+ nombre_archivo + '.0" "' + nombre_archivo + '"\n')
  44. z = 1
  45. while z<i:
  46.    x.write('copy /b "'+ nombre_archivo +'"+"'+ nombre_archivo +'.'+ repr(z)+ '"\n')
  47.    z = z + 1
  48. x.close()
  49.  
  50. # x = open ('pegador_linux', 'w') # Creamos el equivalente .bat para Linux es decir para Bash
  51. # x.write('#!/bin/bash\n')

Ya he corregido el codigo, ya particiona correctamente.


« Última modificación: 4 Julio 2008, 14:34 pm por Shrick » En línea

Ubuntu User
Pascal (2008/2009)
C/C++ (2009/¿?)
8080 Assembler (2009/2010)
MIPS I Assembler (2010/¿?)

Todo lo que yo haga o diga esta bajo:



No pertenece ni a mi ni a nadie :P .
Shrick

Desconectado Desconectado

Mensajes: 259


Yo no se nada, sino ¿porque pregunto?


Ver Perfil
[SOURCE] Cortador de Archivos hecho en Python!
« Respuesta #1 en: 2 Julio 2008, 15:05 pm »

Pegador de archivos

En BATCH:

Código:
copy /b "prueba.jpg.0" "prueba.jpg"
copy /b "prueba.jpg"+"prueba.jpg.1"
copy /b "prueba.jpg"+"prueba.jpg.2"
# Sigues metiendo copy /b "prueba.jpg"+"prueba.jpg.*" hasta que metas todos


« Última modificación: 2 Julio 2008, 17:46 pm por Shrick » En línea

Ubuntu User
Pascal (2008/2009)
C/C++ (2009/¿?)
8080 Assembler (2009/2010)
MIPS I Assembler (2010/¿?)

Todo lo que yo haga o diga esta bajo:



No pertenece ni a mi ni a nadie :P .
carlitos.dll

Desconectado Desconectado

Mensajes: 266



Ver Perfil
Re: [SOURCE] Cortador de Archivos hecho en Python!
« Respuesta #2 en: 2 Julio 2008, 16:47 pm »

Lo probaré en OpenBSD y te cuento qué tal.
gracias por anticipado por el source.
En línea

Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: [SOURCE] Cortador de Archivos hecho en Python!
« Respuesta #3 en: 2 Julio 2008, 17:38 pm »

También lo probaré en cuanto llegue a casa... ;D

Citar
Pegador de archivos
Por HACER...

El pegador no debería darte complicaciones, ya que debería de conseguirse con un for, en el que se van abriendo los archivos y se va guardando su valor, para luego escribirse dicho valor en un archivo

También te aconsejo importar el módulo sys para que ruta y tamano_trozo puedan ser pasados como parámetro por el usuario de este modo..

Código
  1. # -*- coding: cp1252 -*-
  2. # Cortador by Shrick
  3. # Gracias a Google y Documentación de Python
  4. import string
  5. import os
  6. import sys
  7.  
  8. ruta = sys.argv[1] # Archivo a dividir
  9. tamano_trozo = sys.argv[2] # Tamaño de los trozos (Bytes xDDDD)
  10. tamano = os.path.getsize(ruta) # Tamaño del Archivo (Bytes)

Código:
python cortador.py "prueba.jpg" 100000

 ;)

Saludos
« Última modificación: 2 Julio 2008, 17:41 pm por Novlucker » En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
Shrick

Desconectado Desconectado

Mensajes: 259


Yo no se nada, sino ¿porque pregunto?


Ver Perfil
Re: [SOURCE] Cortador de Archivos hecho en Python!
« Respuesta #4 en: 2 Julio 2008, 17:42 pm »

O más fácil miren en bat ;D :

Código
  1. copy /b "prueba.jpg.0" "prueba.jpg"
  2. copy /b "prueba.jpg"+"prueba.jpg.1"
  3. copy /b "prueba.jpg"+"prueba.jpg.2"
  4. # Sigues metiendo copy /b "prueba.jpg"+"prueba.jpg.*" hasta que metas todos

Como ven es muy útil tanto python como batch.

Supongo que tendré que hacer un automatizador para que cree el .bat y simplemente se pega con un .bat y pista.
« Última modificación: 2 Julio 2008, 17:49 pm por Shrick » En línea

Ubuntu User
Pascal (2008/2009)
C/C++ (2009/¿?)
8080 Assembler (2009/2010)
MIPS I Assembler (2010/¿?)

Todo lo que yo haga o diga esta bajo:



No pertenece ni a mi ni a nadie :P .
carlitos.dll

Desconectado Desconectado

Mensajes: 266



Ver Perfil
Re: [SOURCE] Cortador de Archivos hecho en Python!
« Respuesta #5 en: 3 Julio 2008, 06:40 am »

Shryck, lo probé, y funcionó. Al principio me arrojó el siguiente error:
OSError: [Errno 2] No such file or directory: 'prueba.jpg'

Entonces modifiqué el script y le escribí la ruta completa del archivo que quería cortar,

ruta = "/home/miusuario/cortar/Imagen.jpg" # Archivo a dividir

y me generó dos archivos:

Imagen.jpg.0
Imagen.jpg.1

Después lo quise unir (no sé si lo hice bien (al parecer no)), pero escribí lo siguiente:

cat Imagen.jpg.* > ImagenConstruida.jpg

Después comparé:

cmp Imagen.jpg ImagenConstruida.jpg

cmp: EOF on Imagen.jpg

diff Imagen.jpg ImagenConstruida.jpg

Binary files Imagen.jpg and ImagenConstruida.jpg differ

y difieren en el tamaño, aunque la imagen se ve correctamente:

Imagen.jpg 172429B
ImagenConstruida.jpg 172585B

Al parecer, hice mal la unión, porque revisé, y el tamaño de cada archivo es el total del original:

Tortuga.jpg.0 100000B
Tortuga.jpg.1 72429B

Me gustó el script, primer script de python que ejecuto. Lo ejecuté en ksh en OpenBSD 4.3

¿Podrías modificarlo para que realice el cortamiento de archivos pasándole parámetros? parámetro para la acción (por ejemplo c para cortar u para unir, archivo para indicar archivo.

Como ya si que me aburrí del batch de windows, el script podría unir los archivos usando el lenguaje de python, en vez de limitarlo a una consola específica, bueno esa es mi opinión, gracias por el script, y si lo modificas, estaré atento para utilizarlo.


« Última modificación: 3 Julio 2008, 06:45 am por carlitos.dll » En línea

Shrick

Desconectado Desconectado

Mensajes: 259


Yo no se nada, sino ¿porque pregunto?


Ver Perfil
Re: [SOURCE] Cortador de Archivos hecho en Python!
« Respuesta #6 en: 3 Julio 2008, 09:49 am »

Si me poneis el script de como seria en bash lo implemento (es así como se llama no? :xD :xD ), haciendo que compare los sistemas operativos y haga una cosa u otra.

- EDIT -

Modifique el script, Novlucker, gracias.
carlitos.dll pues ha mi me lo pega y tiene el mismo tamaño que el archivo original y los trozos me dan exactamente:

prueba.jpg -> 125 KB (128.625 bytes) (ORIGINAL)
prueba.jpg.0 -> 97,6 KB (100.000 Bytes)
prueba.jpg.1 -> 27,9 KB (28.625 Bytes)
prueba.jpg -> 125 KB (128.625 bytes) (PEGADO por .bat)

La imagen que use llamada prueba.jpg:



Y como haría un frontend (una interfaz gráfica) para facilitar la tarea a los usuarios que tienen pocos conocimientos?

- EDIT2 -

Veo Novlucker, que hay que pasar el argumento de string a integer con la función int(), actualizo el code, estoy intentando hacer un frontend en Delphi haber que sale.

Estoy mirando para hallar nombre de un archivo. -> Hecho.
« Última modificación: 3 Julio 2008, 15:03 pm por Shrick » En línea

Ubuntu User
Pascal (2008/2009)
C/C++ (2009/¿?)
8080 Assembler (2009/2010)
MIPS I Assembler (2010/¿?)

Todo lo que yo haga o diga esta bajo:



No pertenece ni a mi ni a nadie :P .
Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: [SOURCE] Cortador de Archivos hecho en Python!
« Respuesta #7 en: 3 Julio 2008, 15:09 pm »

Citar
Veo Novlucker, que hay que pasar el argumento de string a integer con la función int(), actualizo el code, estoy intentando hacer un frontend en Delphi haber que sale.

Tienes razón Shrick eso se me había pasado  :-X, es que mis conocimientos de python son básicos  :rolleyes:, en su momento preferí, el competidor de python, .... perl ;D

Saludos y sigue así

[Modifico:]Si estás buscando información sobre desarrollo de Gui para python aqui (click) tienes algunos comentarios, y desde ahí puedes llegar a http://wiki.python.org/moin/GuiProgramming donde encontrarás toda la información necesaria, pero en inglés  :-\
« Última modificación: 3 Julio 2008, 15:18 pm por Novlucker » En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
Shrick

Desconectado Desconectado

Mensajes: 259


Yo no se nada, sino ¿porque pregunto?


Ver Perfil
Re: [SOURCE] Cortador de Archivos hecho en Python!
« Respuesta #8 en: 3 Julio 2008, 15:41 pm »

Bueno ya tengo el frotend creado y subido, programado en Delphi el code del .exe es el mismo que de python, pero "compilado", se ejecuta el GUI, para ver como ha quedado de forma gráfica:

Haber que les parece...

- EDIT -

Sorry, puse la versión que no funcionaba.

http://www.mediafire.com/?bztdaj9buho

Esta en fase Alfa.

- EDIT 2 -

Code actualizado ahora se puede meter destino ::) .
« Última modificación: 4 Julio 2008, 14:36 pm por Shrick » En línea

Ubuntu User
Pascal (2008/2009)
C/C++ (2009/¿?)
8080 Assembler (2009/2010)
MIPS I Assembler (2010/¿?)

Todo lo que yo haga o diga esta bajo:



No pertenece ni a mi ni a nadie :P .
Swicher

Desconectado Desconectado

Mensajes: 120


Ver Perfil
Re: [SOURCE] Cortador de Archivos hecho en Python!
« Respuesta #9 en: 11 Julio 2009, 10:40 am »

Si me poneis el script de como seria en bash lo implemento (es así como se llama no? :xD :xD ), haciendo que compare los sistemas operativos y haga una cosa u otra.
[...]
Este programa se ve muy interesante (aunque aun no he podido probarlo, pero creo que me puede ayudar en mis practicas con Python). Por cierto, no se si te servirá de algo, pero, hace unos días encontré este articulo en donde se explica como unir archivos en Linux mediante el comando cat y para comparar los sistemas operativos puedes utilizar el os.name (abajo dejo un ejemplo al respecto):

Código
  1. #Este script revisa el nombre del sistema operativo y en base a ello ejecuta un comando de
  2. # limpieza de la consola
  3. import os
  4. nombre_so = os.name #Fuente: http://www.forosdelweb.com/f130/alguna-forma-mejor-limpiar-consola-626135/
  5. if nombre_so == "posix": #Si es Linux o similar
  6. limpiador = "clear"
  7. elif nombre_so == "nt": #Si es Windows
  8. limpiador = "cls"
  9.  
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[SOURCE,Python,Qt4] VDI Mounting Tool - Montar HDs de VirtualBox en Linux
Programación General
paju1986 0 3,437 Último mensaje 18 Abril 2011, 14:35 pm
por paju1986
Enviar un programa hecho en Python
Scripting
Lavacaloca 4 4,325 Último mensaje 14 Mayo 2011, 01:55 am
por Lavacaloca
Problema con Python archivos
Scripting
AdeLax 2 2,865 Último mensaje 26 Octubre 2013, 21:37 pm
por 0x5d
[AYUDA][PYTHON] No puedo entrar a mi server hecho con SimpleHTTPServer
Scripting
Noxware 1 2,065 Último mensaje 16 Septiembre 2014, 04:39 am
por Noxware
[Python + QT4] Problema con barra de navegador hecho con python y QT4
Scripting
darkweb64 3 3,367 Último mensaje 18 Mayo 2015, 17:23 pm
por darkweb64
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines