Je n'arrive pas à comprendre comment faire cela avec des méthodes de chaîne:
Dans mon dossier, j'ai quelque chose comme 1.012345e0070.123414e-004-0.1234567891.21423 ... ce qui signifie qu'il n'y a pas de séparateur entre les nombres.
Maintenant, si je lis une ligne de ce fichier, je reçois une chaîne comme ci-dessus que je souhaite scinder après, par exemple. 12 caractères. Il n’ya aucun moyen de faire cela avec quelque chose comme str.split()
ou toute autre méthode de chaîne aussi loin que je l’ai vu, mais peut-être que je néglige quelque chose?
THX
Puisque vous voulez itérer de manière inhabituelle, un générateur est un bon moyen d’abstraire ce qui:
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
produit:
1.012345e007
0.123414e-00
4-0.12345678
91.21423
(ce qui ne semble pas correct, mais ce sont les morceaux de 12 caractères)
Vous cherchez coupe en ficelle.
>>> 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
Sortie :
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)
vous pouvez le faire comme ça:
step = 12
for i in range(0, len(string), 12):
slice = string[i:step]
step += 12
de cette façon, à chaque itération, vous obtiendrez une tranche de 14 caractères.
Je suis tombé sur cela en cherchant une solution à un problème similaire, mais dans mon cas, je souhaitais scinder une corde en morceaux de différentes longueurs. Finalement, je l'ai résolu avec 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')]
Prime
Pour ceux qui le trouvent intéressant - j'ai essayé de créer un identifiant pseudo-aléatoire à l'aide de règles spécifiques, ce code fait donc partie de la fonction suivante
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])
Essayez cette fonction:
x = "1.012345e0070.123414e-004-0.1234567891.21423"
while len(x)>0:
v = x[:12]
print v
x = x[12:]
J'ai toujours pensé que, puisque l'opération d'addition de chaîne est possible par une simple logique, la division devrait être comme ça. Lorsque divisé par un nombre, il devrait être divisé par cette longueur. Alors peut-être que c'est ce que vous recherchez.
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 vous ne voulez pas créer une classe entièrement nouvelle, utilisez simplement cette fonction qui re-enveloppe le coeur du code ci-dessus,
>>> 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']