Reste à déterminer quelle fonction permet de faire ceci.
Merci d'avance de votre aide
"La théorie, c'est quand on sait tout et que rien ne fonctionne.La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.Ici, nous avons réuni théorie et pratique: Rien ne fonctionne... et personne ne sait pourquoi !"Albert Einstein
def funct(s)
ls, k, n = [], 0, 3
for i, c in enumerate(s):
if c == '\0':
n -= 1
if not n:
ls.append(s[k:i])
k, n = i + 1, 3
if k < i:
ls.append(s[k:])
return ls
import re
def split(string, size):
return re.findall(".{1,%d}" % size, string)
Ou avec itertools, ce dernier est le plus optimisé, mais attention ça ne renvoie pas une liste de chaînes mais un générateur de tuples.
from itertools import zip_longest
def split(iterable, n, fillvalue=""):
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
Donc ça dépend de ton algo, si tu as besoin obligatoirement d'une liste de chaînes utilise plutôt la solution avec regex, ça sera plus rapide que de prendre celle avec itertools et de faire un join sur chaque tuple.
- Edité par thelinekioubeur 11 mars 2019 à 14:23:09
En modifiant le regex ou sans faire une boucle for (ce qui prendrait beaucoup de temps vu la taille de la chaîne à traiter).
----- EDIT 2 -----
De plus, ceci ne fonctionne pas si la chaîne comprise entre deux "\x00" n'est pas de longueur 1.
- Edité par Dev0110 11 mars 2019 à 19:19:12
"La théorie, c'est quand on sait tout et que rien ne fonctionne.La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.Ici, nous avons réuni théorie et pratique: Rien ne fonctionne... et personne ne sait pourquoi !"Albert Einstein
"abcdef" n'est qu'un exemple. J'aimerais pouvoir splitter des chaines de caractères délimités par des \0 mais uniquement toutes les 3 occurrences de ce caractère.
"La théorie, c'est quand on sait tout et que rien ne fonctionne.La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.Ici, nous avons réuni théorie et pratique: Rien ne fonctionne... et personne ne sait pourquoi !"Albert Einstein
"abcdef" n'est qu'un exemple. J'aimerais pouvoir splitter des chaines de caractères délimités par des \0 mais uniquement toutes les 3 occurrences de ce caractère.
Je suis d'accord avec thelinekioubeur , je me demande comment ont été implantés ces '\x00'.
Si c'est fait via un code, alors je ne comprend pas pourquoi cette stratégie du split n'est pas appliquée à la volée, plutôt que d'y ajouter ce caractère et retravailler par la suite, de nouveau sur l'ensemble du texte.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
"La théorie, c'est quand on sait tout et que rien ne fonctionne.La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.Ici, nous avons réuni théorie et pratique: Rien ne fonctionne... et personne ne sait pourquoi !"Albert Einstein
Si c'est toi qui les a ajouté si, c'est un gros problème sur le concept. Parce-que je ne vois pas en quoi ajouter une chaîne '\x00' serait mieux que d'ajouter chemin par chemin dans une liste par exemple...
Si c'est un logiciel qui génère ce type de format (ce qui m'étonne beaucoup) alors c'est un logiciel bon à mettre à la benne
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
with open(".../old.dat", "rb") as old, open(".../new.dat", "wb") as new:
args = [iter(old.read().split(b"\x00"))] * 3
new.write(b"\n".join(b"\x00".join(row) for row in zip(*args)))
Si c'est toi qui les a ajouté si, c'est un gros problème sur le concept. Parce-que je ne vois pas en quoi ajouter une chaîne '\x00' serait mieux que d'ajouter chemin par chemin dans une liste par exemple...
Si c'est un logiciel qui génère ce type de format (ce qui m'étonne beaucoup) alors c'est un logiciel bon à mettre à la benne
C'est moi qui ajoute ces \0 car c'est le seul caractère qui n'est utilisé par aucun système d'exploitation pour nommer un fichier ou un dossier.
Sinon laquelle des 3 propositions (les 2 de IdiotBête_ et celle de __Nicolas_) est la plus rapide à exécuter ou la plus pythonique ?
Merci pour vos réponses
"La théorie, c'est quand on sait tout et que rien ne fonctionne.La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.Ici, nous avons réuni théorie et pratique: Rien ne fonctionne... et personne ne sait pourquoi !"Albert Einstein
Si c'est toi qui les a ajouté si, c'est un gros problème sur le concept. Parce-que je ne vois pas en quoi ajouter une chaîne '\x00' serait mieux que d'ajouter chemin par chemin dans une liste par exemple...
Si c'est un logiciel qui génère ce type de format (ce qui m'étonne beaucoup) alors c'est un logiciel bon à mettre à la benne
C'est moi qui ajoute ces \0 car c'est le seul caractère qui n'est utilisé par aucun système d'exploitation pour nommer un fichier ou un dossier.
Pourquoi ne pas utiliser le caractère \n dans ce cas ?
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
> C'est moi qui ajoute ces \0 car c'est le seul caractère qui n'est utilisé par aucun système d'exploitation pour nommer un fichier ou un dossier.
Il existe de nombreux caractères qui ne sont pas autorisé dans des noms de fichiers dont des symboles et des ponctuations.
Je précise au cas où, et c'est aussi pour ça que j'ouvre le fichier en mode binaire et que je manipule des bytes dans mon second exemple, \x00 n'est pas un caractère, c'est la représentation d'un octet (byte), en l’occurrence un octet ayant la valeur 0.
Aussi, c'est à l'origine qu'il faut formater correctement le fichier. Convertir le fichier comme on le fait ici ne sert à rien si tu es en mesure, dès le départ, de produire un fichier correct.
C'est un caractère de contrôle, effectivement. Et ce n'est pas non-plus illogique de le voir ici pour signifier la fin d'une entrée.
Personnellement j'aurais formaté le fichier d'origine différemment, type CSV. Pour séparer les colonnes, des barres verticales ou des points-virgules, et pour séparer les lignes... des fins de ligne.
Sur Linux, n'importe quel caractère sauf le NULL peut être utilisé pour nommer un dossier ou un fichier. Le caractère NULL ("\0") est donc une valeur sûre pour délimiter les champs.
Je pense qu'un CSV serait plus lourd qu'un fichier texte formaté avec ce caractère.
thelinekioubeur a écrit:
Ce n'est pas compliqué de tester par toi même la différence de perfs.
Comment le faire sachant que les temps d'éxécution sont de l'ordre de la milliseconde (pas mesurable pour un humain)?
"La théorie, c'est quand on sait tout et que rien ne fonctionne.La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.Ici, nous avons réuni théorie et pratique: Rien ne fonctionne... et personne ne sait pourquoi !"Albert Einstein
with TimeIt():
for _ in range(100000):
fonction_a_mesurer()
- Edité par thelinekioubeur il y a moins de 30s
Super c'est extra !
Temps d'éxécution similaires donc ça ne m'avance pas trop
"La théorie, c'est quand on sait tout et que rien ne fonctionne.La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.Ici, nous avons réuni théorie et pratique: Rien ne fonctionne... et personne ne sait pourquoi !"Albert Einstein
Sur Linux, n'importe quel caractère sauf le NULL peut être utilisé pour nommer un dossier ou un fichier. Le caractère NULL ("\0") est donc une valeur sûre pour délimiter les champs.
Je pense qu'un CSV serait plus lourd qu'un fichier texte formaté avec ce caractère.
Vous pensez ? En 15 ans c'est la première fois que j'entends cela, ça serait bien de vérifier ces affirmations, vous ne pensez pas ?
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Le problème du CSV est que si quelqu'un nomme un dossier avec un ; ça va tout décaler non ?
"La théorie, c'est quand on sait tout et que rien ne fonctionne.La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.Ici, nous avons réuni théorie et pratique: Rien ne fonctionne... et personne ne sait pourquoi !"Albert Einstein
Nommer un dossier avec un point virgule ? Qui fait ça et surtout dans quel but ? J'ai déjà vu les tirets hauts et bas, mais point virgule, jamais... Sinon le csv avec d'autres splitter est possible.
Pourquoi ne pas suivre tout simplement les standards ?
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Je ne sais pas qui le ferait mais j essaye de prévenir toutes les possibilités. Un décalage dans le splittage serait très compliqué à gérer.
"La théorie, c'est quand on sait tout et que rien ne fonctionne.La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.Ici, nous avons réuni théorie et pratique: Rien ne fonctionne... et personne ne sait pourquoi !"Albert Einstein
Je ne sais pas qui le ferait mais j essaye de prévenir toutes les possibilités. Un décalage dans le splittage serait très compliqué à gérer.
Pourquoi dire "c'est compliqué" sans vous expliquer sur la difficulté, car je ne là vois pas me concernant, et pas sûr que les autres membres non plus.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Utiliser le format CSV, et donc la bibliothèque CSV n'a que des avantage dans ton cas. Tu n'as même pas besoin de te soucier des paramètres delimiter, quotechar et autres. La bibliothèque gère tout ça sans problème. Lis la documentation, tu verras, c'est vraiment pratique.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)