Leer caracter por caracter en fichero (Python)

Aziwar

Se puede hacer leer directamente caracter por caracter?

Como único se hacerlo por ahora es leyendo una linea entera y guardándola en un vector, y ya después mirar el vector posición por posición. Pero lo idóneo sería hacerlo directamente desde el fichero.

Estamos hablando de un fichero de texto, si fuera un fichero binario me imagino que con poner read(1) leería de 1 byte en 1 byte

eisenfaust

#1 Sacado de learning python:

while 1:
    next = sys.stdin.read(1)
    if not next:
        break
    # process next

¿Para qué demonios quieres hacer eso?

Aziwar

una práctica de clase q trata de codificar un archivo con el método XOR y tiene que ser caracter a caracter

eisenfaust

Mola eso de programar C en Python xD

Zeroner
from itertools import izip, cycle
 
def xor_crypt_string(data, key):
    return ''.join(chr(ord(x) ^ ord(y)) for (x,y) in izip(data, cycle(key)))
my_data = "Hello. This is a secret message! How fun."
my_key= "firefly"
 
# Do the actual encryption
encrypted = xor_crypt_string(my_data, key=my_key)
 
# This will obtain the original data from the encrypted
original = xor_crypt_string(encrypted, key=my_key)

Algo más legible:

def xor(fileTarget, key):
	fileTarget = fileTarget + os.listdir(fileTarget)[0]
 
ifile = os.path.split(fileTarget)[0]+"/xor.in"
ofile = os.path.split(fileTarget)[0]+"/xor.out"
os.rename(fileTarget, ifile)
 
if os.path.isfile(key):
	kf = open(key)
	keyData = kf.read()
	kf.close()
else:
	keyData = key
 
e = open(ofile, "w")
f = open(ifile, "r")
 
bytesToCopy = os.stat(os.path.split(fileTarget)[0]+"/xor.in")[6]
 
while bytesToCopy:
 
	if bytesToCopy >= len(keyData):
		data = f.read(len(keyData))
		bytesToCopy -= len(keyData)
		encryptedData = ''.join([chr(ord(data[i])^ord(keyData[i])) for i in xrange(len(data))])
		# encryptedData = ''.join(chr(ord(x) ^ ord(y)) for (x,y) in izip(data, cycle(key)))
		e.write(encryptedData)
 
	else:
		data = f.read(bytesToCopy)
		bytesToCopy = 0
		encryptedData = ''.join([chr(ord(data[i])^ord(keyData[i])) for i in xrange(len(data))])
		# encryptedData = ''.join(chr(ord(x) ^ ord(y)) for (x,y) in izip(data, cycle(key)))
		e.write(encryptedData)
os.remove(ifile)
 
e.close()
f.close()
 
return os.path.split(fileTarget)[0]+"/xor.out"
Aziwar

no si por haber ejemplos hay un montones, pero tiene q ser exactamente como dice el profesor, por eso el rollo de leer caracter a caracter desde el fichero

MacSpawn
file = open("blablabla\ruta hasta archivo", "r")
while True:
    letra = file.read(1)
    if not letra:
        print "End of file"
        break
    print "Caracter obtenido:", letra
file.close()

Con esto ya lees letra por letra. Ahora lo que quieras hacer tú con ello (o lo que te haya pedido el profesor xD), es cosa tuya ^^

Aziwar

ahora voy para clase pero si no me equivoco, el read(1) no me funcionaba

MacSpawn

Pues sí que funciona sí, lo he probado y me ha ido printando letra por letra (pd: vigila tema de codificación)

Te dejo el inicio de una de las salidas:

Seguro que te suena qué tipo de archivo he leído.

Aziwar

al final hablando con el profesor, dice q no q lo haga como había comentado desde un principio cargando todo el fichero en una variable ya que no vamos a trabajar con ficheros grandes

Usuarios habituales

  • Aziwar
  • MacSpawn
  • Zeroner
  • eisenfaust