web-dev-qa-db-fra.com

Fractionner la chaîne par nombre de caractères

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

18
BandGap

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)

23
Ned Batchelder

Vous cherchez coupe en ficelle.

>>> x = "1.012345e0070.123414e-004-0.1234567891.21423"
>>> x[2:10]
'012345e0'
11
J.J.
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
4
mopsled
from itertools import izip_longest

def grouper(n, iterable, padvalue=None):
    return izip_longest(*[iter(iterable)]*n, fillvalue=padvalue)
2
BrainStorm

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.

2
Aamir Adnan

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])
1
volcano

Essayez cette fonction:

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

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']
1