Leer y escribir Archivos .doc(word) en Python

Iniciado por Avispon99, 2 Mayo 2018, 03:34 AM

0 Miembros y 1 Visitante están viendo este tema.

Avispon99

Hola..

Tengo una duda. Hice un pequeño programa cliente/servidor en Python y necesito enviar un documento Word por medio de un socket desde un cliente que esta en un sistema operativo windows a un servidor que esta un sistema operativo Linux Ubuntu..

El script me funciona perfectamente con archivos tipo .txt  e imagenes, pero al hacerlo con archivos tipo Word, Power Point, Excel y PDF los documentos llegan como dañados al servidor y no abren.

¿Como se manipulan ese tipo de archivos en Python?

engel lex

leelos como binario, con esto debería bastar para cualquier tipo de archivos
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Avispon99

#2
Cita de: engel lex en  2 Mayo 2018, 03:40 AM
leelos como binario, con esto debería bastar para cualquier tipo de archivos

Si, ya he intentado enviarlo en binario pero no funciona, cuando abro el archivo en Ubuntu me dice  "El archivo esta dañado y no se puede abrir, el daño pudo producirse como resultado de la manipulación del documento o por la transmisión de datos incompleta"

No se como controlar ese tipo de error.. ¿Que podra ser?    

engel lex

comprueba el md5 en recepción completa (no vaya a ser error del ubuntu)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Avispon99

#4
Cita de: engel lex en  2 Mayo 2018, 04:29 AM
comprueba el md5 en recepción completa (no vaya a ser error del ubuntu)

Estuve verificando y descubri que el problema efectivamente es que los bytes de los archivos no llegan completos a su destino, y no solo eso sino que ademas parece que esa parte de bytes que no llegan se quedan atrapados en el bufer por que se alojan en una de las variables que almacenan el socket y luego se imprimen en la consola descontroladamente..

Lo supe cuando envie una imagen ya que la imagen se podia abrir pero solo aparecia la mitad de la imagen y el resto de la imagen se perdio en el camino y luego se imprimio en la terminal en el siguiente ciclo del bufer..

El fragmento de codigo que se encarga de enviar el documento es:

with open(comando, "rb") as archivo:
datos = archivo.read()
self.sock.send("ok")
respuesta = self.sock.recv(2)
if respuesta == "ok":
for byte in datos:
self.sock.send(byte)
self.pausa(1)
self.sock.send("ok")


Y el codigo que recibe el documento es este:

if a == "ok":
with open(cmd, "wb") as file:
conex.send("ok")
while True:
dato = conex.recv(2)
if dato == "ok":
break
file.write(dato)


Necesito encontrar una forma de garantizar que el archivo llegue completo insistiendo multiples veces y que mientras no se haya garantizado que llego completo no se imprima nada en la consola... pero no estoy seguro de como hacerlo... no se si tal vez utilizando algo como un len() con un bucle pueda funcionar o algo similar a eso...
Esto si que esta jodido de resolver ...

                                                                                     :¬¬

engel lex

estás enviando byte por byte, eso puede durar una vida... manda de 1024 en 1024 bytes


revisate como enviar archivos, a ese codigo le falta estructura de control
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Avispon99

#6
Cita de: engel lex en  4 Mayo 2018, 05:33 AM
estás enviando byte por byte, eso puede durar una vida... manda de 1024 en 1024 bytes


revisate como enviar archivos, a ese codigo le falta estructura de control

Si, lo que ocurre es que no quiero colocar el codigo completo aca por que es muy largo y seria incomodo de revisarlo todo aqui.. por eso puse solo la parte relevante..

Respecto a lo que dices de que tarda mucho byte por byte, pues en realidad no tanto ya que de hecho esta mañana estaba funcionando perfectamente y solo se tardaba el envio unos 5 segundos aproximadamente.. pero por alguna extraña razon lo volvi a probar por la noche y ya no servia..

Es como que aveces funciona y aveces se daña..  Ademas note que el bufer no se comporta muy bien cuando le pongo cantidades grandes.. sin embargo voy a intentar lo que tu dices, pero igual estoy seguro que va a voler a fallar en cualquier momento..

Como te decia creo que la unica forma de solucionar esto definitivamente es encontrar una forma en que el codigo intente el envio multiples veces y no se imprima nada hasta que no se garantice el envio exitoso del 100% de los bytes... pero no estoy seguro de como hacerlo, llevo poco tiempo usando este lenguaje y aun se me dificultan esas cosas...

engel lex

#7
insisto XD estás mandando 1byte en un paquete que pesa más de 64 solo con las estructuras de control ip y tpc XD es como si crearas un transporte de una tonelada para llevar a una persona de 60 kg!  (con todo el sarcasmo del mundo)

usualmente lo que se hace es que mandas primero el tamaño del paquete y lees hasta alcanzar ese tamamaño, usas un timeout de 3 segundos y si el tamaño no fue alcanzado y se dispara el timeout, hubo error en el envio, usualmente tambien envías una estructura para indicar el fin del paquete
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Avispon99

#8
Cita de: engel lex en  4 Mayo 2018, 05:58 AM
insisto XD estás mandando 1byte en un paquete que pesa más de 64 solo con las estructuras de control ip y tpc XD es como si crearas un transporte de una tonelada para llevar a una persona de 60 kg!  (con todo el sarcasmo del mundo)

usualmente lo que se hace es que mandas primero el tamaño del paquete y lees hasta alcanzar ese tamamaño, usas un timeout de 3 segundos y si el tamaño no fue alcanzado y se dispara el timeout, hubo error en el envio, usualmente tambien envías una estructura para indicar el fin del paquete

Si, en eso tienes razon sensei, necesito enviar un flag para alertar el final del paquete, respecto a lo que me dices del byte por byte, lo estoy manejando asi por que ubuntu ya me tiene traumatizado, no se por que pero cuando pruebo el codigo en Windows todo me corre perfectamente pero cuando lo pruebo en Ubuntu el bufer se vuelve loco y comienza a hacer cosas paranormales XD .. es por eso que me vi obligado a rebajar el bufer y recibir bytes como un pordiosero.. a esos niveles tan rastreros y humillantes ha llegado mi vida :'v  ... voy a intentar lo que me dices y te reportare los resultados.. pero sera mañana por que tengo sueño..

Nos estamos hablando men..Saludos

Sentex

Me ocurria eso en un proyecto y lo solucione haciendo lo siguiente:

Código (python) [Seleccionar]

            def sfile(file):

                send(file)

                with open(file, "rb") as f:

                    sleep(1)

                    buffer = f.read()
                    bytes = str(len(buffer))
                    send(bytes)

                    sleep(0.2)

                    for byte in buffer:
                        send(byte)


Código (python) [Seleccionar]

        def rfile():
            fiston = recv(1024)
            sleep(1)
            bytes = recv(4096)

            ldata = 0

            try:
                fa = fiston.split('\\')[len(fiston.split('\\'))-1]
            except Exception:
                fa = fiston

            with open(fa, "wb") as f:
                while ldata <= bytes: 

                    data = recv(1)
                    if not len(data):
                        break
                    f.write(data)

                    ldata += 1

                    if ldata == int(bytes):
                        break
                f.close()
Preguntas o peticiones en twitter o discord:

Discord: MrSentex#1227
Twitter: @fbi_sentex