Extraire des données à partir de lignes d'un fichier texte
J'ai besoin d'extraire des données à partir de lignes d'un fichier texte. Les données sont le nom et les informations sur la notation formaté comme ceci:
Shyvana - 12/4/5 - Loss - 2012-11-22
Fizz - 12/4/5 - Win - 2012-11-22
Miss Fortune - 12/4/3 - Win - 2012-11-22
Ce fichier est généré par une autre partie de mon petit programme en python où je demande à l'utilisateur que pour le nom, recherche le nom de ils entrent pour s'assurer qu'il est valide à partir d'une liste de noms, et ensuite demander pour les victimes, les morts, les aides, et s'ils ont gagné ou perdu. Puis-je demander de confirmation et d'écriture des données dans le fichier sur une nouvelle ligne, et ajouter la date à la fin comme ça. Le code qui s'occupe de données:
data = "%s - %s/%s/%s - %s - %s\n" % (
champname, kills, deaths, assists, winloss, timestamp)
Fondamentalement, je veux lire que les données de retour dans une autre partie du programme et de l'afficher à l'utilisateur et d'effectuer des calculs avec elle comme elle est en moyenne de plus de temps pour un nom particulier.
Je suis nouveau sur python et et je ne suis pas très expérimenté avec la programmation en général, donc la plupart de la chaîne du fractionnement et de la mise en forme des exemples que j'ai trouver sont tout simplement trop cryptique pour moi de comprendre comment s'adapter à tout à fait ce dont j'ai besoin ici, quelqu'un pourrait-il aider? J'ai pu formater les données écrites différemment, de manière jeton de trouver serait plus simple, mais je veux qu'il soit simple directement dans le fichier.
- Lorsque vous lisez de nouveau, quelle structure de données voulez-vous de les stocker dans?
- oh! mon dieu merci beaucoup à vous tous enfin un peu de cette séparation d'affaires du sens! Je vais vous donner quelques-uns de ces d'essayer et de voir ce qui fonctionne le mieux pour moi, merci! et joyeux thanksgiving!
Vous devez vous connecter pour publier un commentaire.
La suite sera tout lire dans un dictionnaire identifié par le nom du joueur. La valeur associée à chaque joueur est lui-même un dictionnaire agissant comme un record, avec des champs nommés associés avec les éléments convertis dans un format adapté pour un traitement ultérieur.
De sortie:
Alternativement, plutôt que de tenir la plupart des données dans les dictionnaires, ce qui peut rendre imbriquée accès à un champ un peu maladroit —
info[player]['stats']['kills']
— vous pouvez à la place utiliser un peu plus avancé "générique" de la classe pour les tenir, ce qui vous permettra d'écrireinfo2[player].stats.kills
à la place.Pour illustrer, voici presque la même chose à l'aide d'une classe, j'ai nommé
Struct
parce que c'est un peu comme le langage C eststruct
type de données:De sortie:
print 'Fizz had %s kills in the game' % info['Fizz']['stats']['kills']
. Il y a d'autres façons de structurer vos données, par exemple en utilisant une ou plusieurs des classes personnalisées ou peut-être en utilisant une classe intégrée commenamedtuples
dans lecollections
module. Ils vous permettent d'écrire desinfo['Fizz'].stats.kills
.Struct
idée dans ma mise à jour de la réponse ou pas car il pourrait être trop avancé pour quelqu'un de nouveau à Python -- mais l'alternative aurait été de plusieurs classes personnalisées et/ounamedtuples
- beaucoup plus de code, j'ai donc décidé que ce serait la peine le risque. Le code est très court car les classes sont mises en œuvre en interne à l'aide de dictionnaires.gameid
clé et obtenir00523
de l'lignes[00523] Lulu - 6/1/19 - Win - 2012-11-23
, et je ne suis pas sûr si les dictionnaires le permet, ou si je veux ou pas mais je pense que je voudraisstats
être un sortof "sous-dossier" degameid
, de sorte que le dictionnaire aurait une structure sortof commechampion > gameid > stats > kills, deaths, assists, result, date
je ne suis pas sûr si cela peut être fait avec ce dictionnaire ou pas.gameid
à un associé d'unestats
Struct
composé des éléments que vous avez suivi pour chaque jeu. Ce jeux dictionnaire destats
pourrait alors être un attribut de lachampion
Struct
désignégames
quand il est créé. c'est à direStruct(champ_name=player, games=games_dict, ...)
.import
ouexecfile
ce dernier.shelve
module, qui vous donne essentiellement persistante dictionnaires et est très facile à utiliser car il est tellement semblable à un.Vous souhaitez utiliser split (' - ') pour obtenir les pièces, puis peut-être à nouveau pour obtenir les numéros:
Devrait vous obtenir tous les trucs dont vous avez besoin dans les données[] et nums[]. Alternativement, vous pouvez utiliser le module re et écrire une expression régulière pour elle. Cela ne semble pas suffisamment complexe pour que, si.
Il y a deux façons de lire les données à partir de votre fichier texte exemple.
Première méthode
Vous pouvez utiliser python csv module et de préciser que votre délimiteur est
-
.Voir http://www.doughellmann.com/PyMOTW/csv/
Deuxième méthode
Alternativement, si vous ne voulez pas utiliser ce module csv, vous pouvez simplement utiliser la
split
méthode après avoir lu chaque ligne dans votre fichier sous forme de chaîne.Donc dans votre exemple ci-dessus,
champname
sera effectivement le premier élément de lawords
liste, qui estwords[0]
.for line in ["Miss Fortune - 12/4/3 - Win - 2012-11-22"]:
, dans une liste et non pas la chaîne brute. Sinon ça va lire les caractères individuels et essayer d'extraire l'information à partir d'eux.Tout d'abord, vous le saut de ligne dans les fragments de données
Deuxième, analyser votre score
Et enfin, de convertir la chaîne de date à date objet
Maintenant, vous avez toutes vos pièces analysées et normalisé pour les types de données.