TypeError: chaîne attendue ou tampon avec le feu.match et matchObj.groupe()
Je reçois l'erreur:
Traceback (most recent call last):
File "ba.py", line 13, in <module>
matchObj = re.match(r"^(\w+ \w+) batted (\d+) times with (\d+) hits and (\d+) runs", line)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 137, in match
return _compile(pattern, flags).match(string)
TypeError: expected string or buffer
-
line
doit utiliserline.strip
de lire chaque ligne du fichier -
re.match
utilise une expression régulière pour rechercher les matches à 3 groupes (players
,hits
,atBats
) dans la chaîne -
matchObj.group()
devrait lire chaque groupe et de mettre les stats où ils vontplayerStats{}
dictionnaire
Comment puis-je obtenir ré.match d'attribuer un type à la matchObj donc je peux tirer avec un groupe() et ajouter à playerStats()?
import re, sys, os
if len(sys.argv) < 2:
sys.exit("Usage: %s filename" % sys.argv[0])
filename = sys.argv[1]
if not os.path.exists(filename):
sys.exit("Error: File '%s' not found" % sys.argv[1])
playerStats = {'players': (0, 0, 0)}
matchObj = re.match(r"^(\w+ \w+) batted (\d+) times with (\d+) hits and (\d+) runs", line)
with open(filename) as f:
for line in f:
line = line.strip()
if player in playerStats:
playerStats[players][0] += atBat
playerStats[players][1] += hit
if player not in players:
player = matchObj.group(1)
playerStats[players][0] = atBat
playerStats[players][1] = hit
avgs = 0
else:
playerStats[players] = player
playerStats[players][0] = atBat
playerStats[players][1] = hit
playerStats[players][2] = 0
try:
player = matchObj.group(1)
atBat = matchObj.group(2)
hit = matchObj.group(3)
except AttributeError as ae:
print str(ae), "\skipping line:", line
except IndexError as ie:
print str(ie), "\skipping line:", line
#calculates averages
for players in playerStats:
avgs[player] = round(float(hits[player])/float(atBats[player]), 3)
print "%s: %.3f" % (player, avgs[player])
- Hmm, non, ce n'est pas la façon dont vous utilisez
re.match
. La façon dont vous l'avez écrit, vous êtes à la recherche pour votre expression régulière dans la chaîne littérale "ligne", et non pas dans la variableline
. Depuis la chaîne ne correspond pas à la re, puis re.match() retourne Aucun, d'où l'erreur. Vérifiez ici: tutorialspoint.com/python/python_reg_expressions.htm - J'ai édité au dessus, j'ai d'abord eu comme ligne de pas "en ligne" mais je reçois le message d'erreur qui est maintenant collé en haut quand vous le faites. Est ligne, pas une chaîne de caractères après aide de la ligne.la bande?
Vous devez vous connecter pour publier un commentaire.
Vous êtes à la lecture de la totalité du fichier en ligne. Vous obtenez ce message d'erreur parce que la ligne est une liste qui n'est pas une chaîne de caractères ou un tampon. Si vous êtes en boucle à travers chaque ligne de mettre votre bande à l'intérieur de la boucle for. L'échantillon ci-dessous pour vous aider à obtenir commencé.
Également, sauf si vous montrent des exemples de formulaire de données de votre fichier texte je ne peux pas dire si votre regex est exacte.
Mise à jour:
Voici une version de travail en fonction de vos commentaires et de mise à jour. N'hésitez pas à modifier que vous avez besoin:
Contenu de in.txt:
Sortie:
code
pour les joueurs en playerStats:code
. Je ne suis pas super familier avec essayer: et je ne sais pas si sa pose problème, voyez-vous quelque chose de mal?