web-dev-qa-db-fra.com

re.sub en erreur avec "Objet attendu de type chaîne ou octets"

J'ai lu plusieurs billets concernant cette erreur, mais je n'arrive toujours pas à le comprendre. Lorsque j'essaie de parcourir ma fonction en boucle:

def fix_Plan(location):
    letters_only = re.sub("[^a-zA-Z]",  # Search for all non-letters
                          " ",          # Replace all non-letters with spaces
                          location)     # Column and row to search    

    words = letters_only.lower().split()     
    stops = set(stopwords.words("english"))      
    meaningful_words = [w for w in words if not w in stops]      
    return (" ".join(meaningful_words))    

col_Plan = fix_Plan(train["Plan"][0])    
num_responses = train["Plan"].size    
clean_Plan_responses = []

for i in range(0,num_responses):
    clean_Plan_responses.append(fix_Plan(train["Plan"][i]))

Voici l'erreur:

Traceback (most recent call last):
  File "C:/Users/xxxxx/PycharmProjects/tronc/tronc2.py", line 48, in <module>
    clean_Plan_responses.append(fix_Plan(train["Plan"][i]))
  File "C:/Users/xxxxx/PycharmProjects/tronc/tronc2.py", line 22, in fix_Plan
    location)  # Column and row to search
  File "C:\Users\xxxxx\AppData\Local\Programs\Python\Python36\lib\re.py", line 191, in sub
    return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object
33
imanexcelnoob

Comme vous l'avez dit dans vos commentaires, certaines des valeurs semblaient être des flottants, pas des chaînes. Vous devrez le changer en chaînes avant de le passer à re.sub. Le moyen le plus simple consiste à remplacer location par str(location) lors de l'utilisation de re.sub. De toute façon, cela ne ferait pas de mal, même si c'est déjà un str.

letters_only = re.sub("[^a-zA-Z]",  # Search for all non-letters
                          " ",          # Replace all non-letters with spaces
                          str(location))
51
abccd