Bonjour,
Je ne traite que "je souhaite insérer toutes les 66 fois que je compte des ';' un retour à la ligne". Je fais un fichier de test:
open('dummyIn.txt', 'w').write(';'.join(['zorglub ' + str(_1) + ' frunabulax ' for _1 in range((66 * 10) + 4)]))
J'ouvre ce fichier en lecture, je le lis (read()) ce qui me donne une chaine, puis je split(';'), ce qui me donne une liste de chaines:
x = open('dummyIn.txt', 'r').read().split(';')
Je factorise le nombre de ';' à compter:Je groupe des paquets de nsepsbyline chaines, ce qui me donne une liste de paquets (listes) de chaines. Le dernier paquet incomplet ne pose pas de problème, voir la doc sur les slices:
[x[_1 : _1 + nsepsbyline] for _1 in range(0, len(x), nsepsbyline)]
Je réassemble chaque paquet par un ';', j'obtiens à nouveau une liste de chaines (le code inclut le précédent):
[';'.join(x[_1 : _1 + nsepsbyline]) for _1 in range(0, len(x), nsepsbyline)]
Maintenant je rassemble ces chaines par ';\n', j'"obtient une chaine (le code inclut le précédent):
';\n'.join([';'.join(x[_1 : _1 + nsepsbyline]) for _1 in range(0, len(x), nsepsbyline)])
Long à expliquer, mais le tout tient en une ligne
open('dummyOut.txt', 'w').write(';\n'.join([';'.join(x[_1 : _1 + nsepsbyline]) for _1 in range(0, len(x), nsepsbyline)]))
Si les fichiers sont très gros, ça peut poser un problème d'occupation mémoire. On peut alors tenter:
1 2
| from itertools import islice
open('dummyOut.txt', 'w').write(';\n'.join([';'.join(islice(x, _1, _1 + nsepsbyline)) for _1 in xrange(0, len(x), nsepsbyline)])) |
mais le ...read().split(';') va demeurer et c'est là que ça coince.
L'autre approche est la lecture du fichier octet par octet, et l'écriture par exemple ligne par ligne:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| fin = open('dummyIn.txt', 'rb')
fout = open('dummyOut.txt', 'wb')
seps, line, caract = 0, '', fin.read(1)
while caract != '':
line += caract
if caract == ';':
seps += 1
if seps % nsepsbyline == 0:
fout.write(line + '\n')
line = ''
caract = fin.read(1)
if len(line) != 0:
fout.write(line)
fout.close()
fin.close() |
Là, il n'y aura pas de souci de mémoire, mais peut-être de performance (en fait, je ne crois pas).
Partager