Dividir cadena por cuenta de caracteres

No puedo averiguar cómo hacer esto con los métodos de cadena:

En mi archivo tengo algo como 1.012345e0070.123414e-004-0.1234567891.21423 … lo que significa que no hay un delimitador entre los números.

Ahora, si leo una línea de este archivo, obtengo una cadena como la que quiero dividir después de, por ejemplo, 12 caracteres. No hay manera de hacer esto con algo como str.split() o cualquier otro método de cadena por lo que he visto, pero tal vez estoy pasando por alto algo.

Gracias

Como quiere iterar de una manera inusual, un generador es una buena forma de abstraer eso:

 def chunks(s, n): """Produce `n`-character chunks from `s`.""" for start in range(0, len(s), n): yield s[start:start+n] nums = "1.012345e0070.123414e-004-0.1234567891.21423" for chunk in chunks(nums, 12): print chunk 

produce:

 1.012345e007 0.123414e-00 4-0.12345678 91.21423 

(que no se ve bien, pero esos son los trozos de 12 caracteres)

Estás buscando cortar la cuerda.

 >>> x = "1.012345e0070.123414e-004-0.1234567891.21423" >>> x[2:10] '012345e0' 
 line = "1.012345e0070.123414e-004-0.1234567891.21423" firstNumber = line[:12] restOfLine = line[12:] print firstNumber print restOfLine 

Salida :

 1.012345e007 0.123414e-004-0.1234567891.21423 
 from itertools import izip_longest def grouper(n, iterable, padvalue=None): return izip_longest(*[iter(iterable)]*n, fillvalue=padvalue) 

Puedes hacerlo así:

 step = 12 for i in range(0, len(string), 12): slice = string[i:step] step += 12 

De esta manera, en cada iteración obtendrá una porción de 14 caracteres.

Prueba esta función:

 x = "1.012345e0070.123414e-004-0.1234567891.21423" while len(x)>0: v = x[:12] print v x = x[12:] 

Me topé con esto mientras buscaba una solución para un problema similar, pero en mi caso quería dividir la cadena en trozos de diferentes longitudes. Eventualmente lo resolví con RE

 In [13]: import re In [14]: random_val = '07eb8010e539e2621cb100e4f33a2ff9' In [15]: dashmap=(8, 4, 4, 4, 12) In [16]: re.findall(''.join('(\S{{{}}})'.format(l) for l in dashmap), random_val) Out[16]: [('07eb8010', 'e539', 'e262', '1cb1', '00e4f33a2ff9')] 

Prima

Para aquellos que puedan encontrarlo interesante: traté de crear una ID pseudoaleatoria mediante reglas específicas, por lo que este código es en realidad parte de la siguiente función

 import re, time, random def random_id_from_time_hash(dashmap=(8, 4, 4, 4, 12)): random_val = '' while len(random_val) < sum(dashmap): random_val += '{:016x}'.format(hash(time.time() * random.randint(1, 1000))) return '-'.join(re.findall(''.join('(\S{{{}}})'.format(l) for l in dashmap), random_val)[0]) 

Siempre pensé que, dado que la operación de adición de cadenas es posible mediante una lógica simple, la división puede ser así. Cuando se divide por un número, debe dividirse por esa longitud. Así que puede ser esto lo que estás buscando.

 class MyString: def __init__(self, string): self.string = string def __div__(self, div): l = [] for i in range(0, len(self.string), div): l.append(self.string[i:i+div]) return l >>> m = MyString(s) >>> m/3 ['abc', 'bdb', 'fbf', 'bfb'] >>> m = MyString('abcd') >>> m/3 ['abc', 'd'] 

Si no desea crear una clase completamente nueva, simplemente use esta función que vuelve a envolver el núcleo del código anterior,

 >>> def string_divide(string, div): l = [] for i in range(0, len(string), div): l.append(string[i:i+div]) return l >>> string_divide('abcdefghijklmnopqrstuvwxyz', 15) ['abcdefghijklmno', 'pqrstuvwxyz']