Expected string or bytes like object python ошибка

Как исправить: ошибка типа: ожидаемая строка или байтовый объект

  • Редакция Кодкампа

17 авг. 2022 г.
читать 1 мин


Одна ошибка, с которой вы можете столкнуться при использовании Python:

TypeError : expected string or bytes-like object

Эта ошибка обычно возникает, когда вы пытаетесь использовать функцию re.sub() для замены определенных шаблонов в объекте, но объект, с которым вы работаете, не состоит полностью из строк.

В следующем примере показано, как исправить эту ошибку на практике.

Как воспроизвести ошибку

Предположим, у нас есть следующий список значений:

#define list of values
x = [1, 'A', 2, 'B', 5, 'C', 'D', 'E']

Теперь предположим, что мы пытаемся заменить каждую небукву в списке пустой строкой:

import re

#attempt to replace each non-letter with empty string
x = re. sub('[^a-zA-Z]', '', x)

TypeError : expected string or bytes-like object

Мы получаем ошибку, потому что в списке есть определенные значения, которые не являются строками.

Как исправить ошибку

Самый простой способ исправить эту ошибку — преобразовать список в строковый объект, заключив его в оператор str() :

import re

#replace each non-letter with empty string
x = re. sub('[^a-zA-Z]', '', str (x))

#display results
print(x)

ABCDE

Обратите внимание, что мы не получили сообщение об ошибке, потому что использовали функцию str() для первого преобразования списка в строковый объект.

Результатом является исходный список, в котором каждая небуква заменена пробелом.

Примечание.Полную документацию по функции re.sub() можно найти здесь .

Дополнительные ресурсы

В следующих руководствах объясняется, как исправить другие распространенные ошибки в Python:

Как исправить KeyError в Pandas
Как исправить: ValueError: невозможно преобразовать число с плавающей запятой NaN в целое число
Как исправить: ValueError: операнды не могли транслироваться вместе с фигурами

I have read multiple posts regarding this error, but I still can’t figure it out. When I try to loop through my function:

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]))

Here is the error:

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:UsersxxxxxAppDataLocalProgramsPythonPython36libre.py", line 191, in sub
    return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object

Приветствую, ситуация следующая. Имеется проект блога на flask, подключил админку по средствам flask-admin. Настроил через app.py путем добавления:

admin.add_view(ModelView(Post, db.session))
admin.add_view(ModelView(Tag, db.session))

В первом случае работа с постами идет без нареканий (создать пост, редактировать, удалить). Всё отрабатывает на ура.

Но что касаться Tag то вот тут и возникает проблема. Редактируються уже созданные (в ручную) теги замечательно, но вот при создании тега, после заполнения полей вылетает следующие сообщение:

builtins.TypeError
TypeError: expected string or bytes-like object

Traceback (most recent call last):
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/flask/app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/flask/app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/flask/app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/flask_admin/base.py", line 69, in inner
    return self._run_view(f, *args, **kwargs)
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/flask_admin/base.py", line 368, in _run_view
    return fn(self, *args, **kwargs)
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/flask_admin/model/base.py", line 1997, in create_view
    model = self.create_model(form)
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/flask_admin/contrib/sqla/view.py", line 1079, in create_model
    if not self.handle_view_exception(ex):
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/flask_admin/contrib/sqla/view.py", line 1062, in handle_view_exception
    return super(ModelView, self).handle_view_exception(exc)
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/flask_admin/contrib/sqla/view.py", line 1073, in create_model
    model = self.model()
  File "<string>", line 4, in __init__

  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/sqlalchemy/orm/state.py", line 417, in _initialize_instance
    manager.dispatch.init_failure(self, args, kwargs)
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 66, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 187, in reraise
    raise value
  File "/home/moonz/Рабочий стол/Flask/venv/lib/python3.6/site-packages/sqlalchemy/orm/state.py", line 414, in _initialize_instance
    return manager.original_init(*mixed[1:], **kwargs)
  File "/home/moonz/Рабочий стол/Flask/models.py", line 50, in __init__
    self.slug = slugify(self.name)
  File "/home/moonz/Рабочий стол/Flask/models.py", line 8, in slugify
    return re.sub(pattern, '-', s)  # Заменяет их на дефис
  File "/usr/lib/python3.6/re.py", line 191, in sub
    return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object

Как я понимаю, на вход поступает неверный тип данных, но вот где именно проблема (а точнее в Чём) понять не могу. Буду благодарен любым подсказкам, заранее благодарю.

Уведомления

  • Начало
  • » Python для новичков
  • » Множественные замены в текстовом файле

#1 Авг. 25, 2017 11:55:14

Множественные замены в текстовом файле

Добрый день.
Подскажите пожалуйста как в текстовом файле сделать замену по шаблону, с сохранением строк и последующей записью.

Например. Нужно заменить во всем файле “age” на “years” и “fname” на “surname”

 pname 1; fname 1; age 1
pname 2; fname 2; age 2
pname 3; fname 3; age 3

Офлайн

  • Пожаловаться

#2 Авг. 25, 2017 12:10:00

Множественные замены в текстовом файле

Метод replace

С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

  • Пожаловаться

#3 Авг. 25, 2017 12:24:43

Множественные замены в текстовом файле

Почему выдает ошибку?

File “C:Python 3.6libre.py”, line 191, in sub
return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object

 def parsing():
    rpl = [['Нормальный ', ''],
           ['Дверь', ''],
           ['Дата: ', ''],
           [' Область: ', '']]
    f_in = open('in.csv', 'r')
    f_out = open('out.txt', 'w', encoding='utf-8')
    for string in rpl:
        input_file = re.sub(str(string[0]),str(string[1]),f_in)  
    f_out.write(input_file)
    f_in.close()
    f_out.close()

Отредактировано Ubhra (Авг. 25, 2017 12:57:48)

Офлайн

  • Пожаловаться

#4 Авг. 25, 2017 13:12:05

Множественные замены в текстовом файле

Ubhra
Почему выдает ошибку?

в re.sub третий параметр должен быть строкой или набором байт. а у тебя это объект файла.

Офлайн

  • Пожаловаться

#5 Авг. 25, 2017 13:43:41

Множественные замены в текстовом файле

open(‘in.csv’, ‘r’)
должен ведь возвращать содержимое файла одной строкой

П.С. Аааа точно его же прочесть нужно:

 input_file = re.sub(str(string[0]),str(string[1]),f_in.read())

Вот только он создает пустой файл.

Отредактировано Ubhra (Авг. 25, 2017 13:46:35)

Офлайн

  • Пожаловаться

#6 Авг. 25, 2017 14:05:51

Множественные замены в текстовом файле

Вот так частично заработало, но изменяет только первую запись:

 def parsing():
    rpl = [['Нормальный ', ''],['Дверь', ''],['Дата: ', ''],[' Область: ', '']]
    f_in = open('in.csv', 'r')
    f_out = open('out.txt', 'w', encoding='utf-8')
    for string in rpl:
        f_out.write(re.sub(str(string[0]),str(string[1]),f_in.read()))
    f_in.close()
    f_out.close()
    print('ok')

Офлайн

  • Пожаловаться

#7 Авг. 25, 2017 14:29:02

Множественные замены в текстовом файле

Питон зверюга всеядная. У меня так заработало :D :

 def parsing():
    f_in = open('in.csv', 'r')
    f_out = open('out.txt', 'w', encoding='utf-8')
    nf1 = re.sub(str('Нормальный вход по ключу'),str('вход'),f_in.read())
    nf2 = re.sub(str('Нормальный выход по ключу'),str('выход'),nf1)
    nf3 = re.sub(str('Дверь'),str(''),nf2)
    nf4 = re.sub(str('Дата: '),str(''),nf3)
    nf5 = re.sub(str(' Область: '),str(''),nf4)
    nf6 = re.sub(str('"'),str(''),nf5)
    f_out.write(nf6)
    f_in.close()
    f_out.close()
    print('ok')

Офлайн

  • Пожаловаться

#9 Апрель 25, 2020 21:17:13

Множественные замены в текстовом файле

Добрый день!
Не подскажете, почему выдаёт ту же самую “зловредную” ошибку “TypeError: expected string or bytes-like object”?

import re, urllib.request
class HTMLFinder:
def findTag(website, tag):
url = urllib.request.urlopen(website)
tags = url.read()
tagsF = ‘’’»’
for line in tags:
if re.search(tag, line):
tagsF = tagsF + line + ‘/n’
if len(tagsF) < 3: return False
else: return tagsF

Ну я в принципе-то всё правильно написал, пробелы есть, а пишет всё то же(((

Отредактировано PyBeg (Апрель 25, 2020 21:19:47)

Офлайн

  • Пожаловаться

#10 Апрель 26, 2020 04:21:49

Множественные замены в текстовом файле

PyBeg
Не подскажете, почему выдаёт ту же самую “зловредную” ошибку “TypeError: expected string or bytes-like object”?

Потому что принятые данные в байтах надо раскодировать через метод .decode() в юникод-строку. Для раскодирования надо использовать кодировку, которая передаётся вместе с данными. Можно и наугад раскодировать, использовав распространённую кодировку utf-8. Для одного случая подойдёт. Для общего же случая (когда сайт произвольный) надо узнавать кодировку, прежде чем раскодировать, и для этого нужно дополнительный код писать.

Отредактировано py.user.next (Апрель 26, 2020 04:22:32)

Офлайн

  • Пожаловаться

  • Начало
  • » Python для новичков
  • » Множественные замены в текстовом файле

One error you may encounter when using Python is:

TypeError: expected string or bytes-like object

This error typically occurs when you attempt to use the re.sub() function to replace certain patterns in an object but the object you’re working with is not composed entirely of strings.

The following example shows how to fix this error in practice.

How to Reproduce the Error

Suppose we have the following list of values:

#define list of values
x = [1, 'A', 2, 'B', 5, 'C', 'D', 'E']

Now suppose we attempt to replace each non-letter in the list with an empty string:

import re

#attempt to replace each non-letter with empty string
x = re.sub('[^a-zA-Z]', '', x)

TypeError: expected string or bytes-like object

We receive an error because there are certain values in the list that are not strings.

How to Fix the Error

The easiest way to fix this error is to convert the list to a string object by wrapping it in the str() operator:

import re

#replace each non-letter with empty string
x = re.sub('[^a-zA-Z]', '', str(x))

#display results
print(x)

ABCDE

Notice that we don’t receive an error because we used str() to first convert the list to a string object.

The result is the original list with each non-letter replaced with a blank.

Note: You can find the complete documentation for the re.sub() function here.

Additional Resources

The following tutorials explain how to fix other common errors in Python:

How to Fix KeyError in Pandas
How to Fix: ValueError: cannot convert float NaN to integer
How to Fix: ValueError: operands could not be broadcast together with shapes

Понравилась статья? Поделить с друзьями:
  • Expected end with ошибка
  • Expected end sub ошибка vba
  • Expected array ошибка vba excel
  • Exp 91 кадиллак ошибка
  • Exloader ошибка антивирус