J'ai un fichier texte contenant d'abord et de la dernière "syllabes ', délimité avec [part1] et [part2]: tout ce que je veux faire est de choisir une ligne aléatoire, entre [ Part1] et [part2], puis une autre ligne aléatoire entre [Part2] et la fin du fichier, et concaténate les deux ensemble (par exemple, "AEDAR", "Moglar") pour créer des noms aléatoires. P> Cependant, je ne sais pas comment analyser efficacement le fichier texte avec readline (). Y a-t-il un meilleur moyen que de balayer chaque ligne séquentiellement et de les stocker dans une liste d'où je peux choisir un élément aléatoire? P> P>
4 Réponses :
Serialize ( Pickle ) Un dictionnaire d'un fichier à la place.
Exemple: p>
SD ['Part1'] [Random.Randint (0, Len (SD ["PART1 ']) - 1)] CODE> ... ou tout simplement
Random.choice (SD [" Part1 " ]) code> ou l'ensemble des dernières lignes comme
impression '' '.join (aléatoire.choice (sd [particularité]) pour Partname dans Tri (sd)) code>
@eumiro - Yep, a vu votre réponse ci-dessous, définitivement plus élégante. bon travail!
@Aj - Quoi qu'il en soit, votre idée dict / cornichon est meilleure que le fichier d'origine.
@eumiro - merci! Je préfère définitivement l'idée de séparer la création / maintenance des fonctions d'administration de la consommation de ses données (fonctions commerciales / applications). Le cornichon semblait juste être un protocole très simple à utiliser entre ces deux utilisateurs / rôles.
Je comprends, mais j'aimerais que les données existent dans le fichier texte, à moins que je ne me trompais pas, ne sommes-nous pas enlevés la dicte dans un fichier, puis le désactivez à nouveau comme un objet? Y a-t-il une manière que je puisse simplement avoir la déclaration pour D dans un fichier texte et non dans le code?
@persepolis - Vous pouvez conserver les données dans un fichier texte et la lire de cette manière également. @eumiro a fourni une réponse ci-dessous qui analyse le format de fichier que vous avez spécifié dans la question initiale. Si vous envisagez de travailler avec de grandes quantités de données, relecture d'un fichier texte après chaque mise à jour sera incrémentiteuse.
Vous devrez lire tout le dossier à un moment donné, à moins que vous sachiez au préalable combien de préfixes et de suffixes il y a. Depuis que je suppose que vous ne le faites pas, ni que cela peut changer et que vous ne voulez pas maintenir un numéro pour stocker cela, vous devrez lire dans le dossier, et readline () est un bon moyen de le faire. < / p>
Cependant, vous pouvez pré-traiter votre fichier texte afin qu'il utilise un autre format, tel qu'un cornichon < / a> fichier. En d'autres termes, lisez le fichier texte dans un dictionnaire et cornichez ce dictionnaire. Le dictionnaire pourrait ressembler à quelque chose comme ceci: p>
de la longueur des tableaux, vous pouvez alors déterminer quel est le nombre aléatoire maximal. Il devrait être plus efficace que la lecture d'une ligne de fichier entière à chaque fois. Et sinon, au moins c'est une solution plus élégante. P> dic = {'préfixes': ['ae', 'di', ...],
'Suffixes': ["Dar", "kil", ...]} code> p>
Aekil Didar Mokil Mokil Moglar Moglar Diglar Famdar Famdar Modar
'r' code> est un mode par défaut; Vous pouvez l'omettre.
f.readlines () code> lit tout un fichier en mémoire;
pour la ligne en f: code> pourrait être utilisé à la place. Vous pouvez écrire
courrielline = pièces [ligne [1: -1]] = [] code> sur une seule ligne. Le premier
couranteListe code> (avant tout
'[partie ...]' code> lignes) n'est ajouté nulle part (les valeurs sont supprimées).
Vous pouvez utiliser fichierInput.input () code> au lieu de codage du code de fichier.
here's what I mean: stackoverflow .com / questions / 5731670 / ...
modifié @ Eumiro's Script :
Famglar Famkil Didar Ditres Aedar Famglar Ditres Famtres Ditres Modar
Il semble que vous ayez le contrôle du format de fichier, vous ne pouvez pas le changer à quelque chose de plus facile à analyser?
Il serait beaucoup plus facile d'utiliser deux fichiers.