Python: удалить часть строки из списка строк

#python #xlrd

#python #xlrd

Вопрос:

Я использовал xlrd для извлечения столбца из листа Excel для преобразования в список.

 from xlrd import open_workbook
book = xlrd.open_workbook("HEENT.xlsx").sheet_by_index(0)
med_name = []
for row in sheet.col(2):
    med_name.append(row)
med_school = []
for row in sheet.col(3):
    med_school.append(row)
print(med_school)
  

Ниже приведен фрагмент списка: med_school.

 [text:'University of San Francisco', 
text: 'Harvard University', 
text:'Class of 2016, University of Maryland School of Medicine', 
text:'Class of 2015, Johns Hopkins University School of Medicine', 
text:'Class of 2014, Raymond and Ruth Perelman School of Medicine at the
University of Pennsylvania']
  

Я хочу удалить «текст:’Класс 2014» из каждой строки в списке. Я попытался понять список, но получил ошибку атрибута: объект ‘Cell’ не имеет атрибута ‘strip’. Кто-нибудь знает способ создать список названий медицинских школ, в которых есть только названия медицинских школ без учебного года и слова «текст»?

Комментарии:

1. Что-то не так с выводом этого примера списка. Возможно, там должны быть дополнительные кавычки, например "text: 'Class of ...'" ? Возможно, скопируйте / вставьте непосредственно из вашего вывода сюда, если вы еще этого не сделали.

2. Вы уверены, что перед текстом: и в конце каждой строки нет двойных кавычек?

3. В выводе списка нет ничего плохого, это просто способ xlrd.Cell реализации экземпляра __repr__

4. Спасибо @donkopotamus за разъяснение. Да, я скопировал и вставил выходные данные списка.

5. Не могли бы вы обновить описание проблемы, чтобы оно было полным и точным? Отсутствующие кавычки, удаление только 2014, предполагая, что «Класс» строки существует … каждый из них принес вам обратную связь, которая не решает вашу реальную проблему.

Ответ №1:

Он xlrd не возвращает вам строки, он возвращает вам экземпляры вызываемого класса Cell . У этого есть свойство value , которое содержит строку, которую вы видите.

Чтобы изменить их просто:

 for cell in med_school:
    cell.value = cell.value[:15]
  

Это приведет к удалению первых 15 символов («Класс 2014 года»). В качестве альтернативы вы можете использовать другие подходы, такие как разделение строк (на «,») или регулярное выражение.

Дело в том, что вы должны работать не непосредственно со значениями в med_schools списке, а с их .value свойством. Или извлеките ее в другое место, где вы могли бы с ней поработать.

Например, чтобы получить все текстовые свойства, отбросив префикс:

 values = [cell.value[15:] for cell in med_schools]
  

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

 values = [re.sub(r"^Class of d{4}, ", "", cell.value) for cell in med_schools]
  

Комментарии:

1. Я попробовал первые два решения, и я получил ошибку атрибута: объект ‘Cell’ не имеет атрибута ‘text’

2. Изменить .text на .value

3. большое вам спасибо! Мой код сработал. У вас есть ссылка на эту документацию? Некоторые из моих значений не имеют «Класса 201», поэтому я ищу синтаксис того, как выполнить оператор if, который удаляет только первые 15 символов, когда значение имеет «Класс 201».

Ответ №2:

Используйте данный разделитель, чтобы отрезать начало каждой строки. Сначала проверьте, чтобы убедиться, что у него есть «Класс», поэтому мы знаем, что там есть пробел через запятую.

 med_school = ["text:'Class of 2016, University of Maryland School of Medicine'",  
              "text:'Class of 2015, Johns Hopkins University School of Medicine'", 
              "text:'Class of 2014, Raymond and Ruth Perelman School of Medicine at the University of Pennsylvania'",
              "text:'Class of 1989, Rush Medical School / Knox College'",
              "text:'Bernie's Back-Alley School of Black-Market Techniques'"
             ]

school_name = []
for first in med_school:
    name = first.value
    if ", " in name:
        cut  = name.index(", ")
        name = name[cut 2:]
    else:
        name = name[6:-1]
    school_name.append(name)

print school_name
  

вывод (с дополнительными переводами строк для улучшения удобочитаемости):

 ["University of Maryland School of Medicine'",
 "Johns Hopkins University School of Medicine'",
 "Raymond and Ruth Perelman School of Medicine at the University of Pennsylvania'"
 "Rush Medical School / Knox College'", 
 "Bernie's Back-Alley School of Black-Market Techniques"]
  

Вы также можете обернуть цикл в понимание списка:

 school_name = [name.value[name.value.index(", ") 2:] 
                       if ", " in name 
                       else name[6:-1]   
                   for name in med_school]
  

Комментарии:

1. Я также попробовал это решение, и я получил ошибку атрибута: объект ‘Cell’ не имеет атрибута ‘index’

2. Я попробовал оба решения, и я столкнулся с ошибкой значения, которая гласит «подстрока не найдена». Ошибка возникает в строке с «name.value.index(«, «))

3. Это то, что происходит, если в name.value нет запятой. Существуют ли такие записи?

4. В некоторых ячейках нет «Класса 201» и запятой. Я хочу удалить только те символы из ячеек, которые имеют «Класс».

5. Тогда я подозреваю, что код, который дал вам @donkopotamus, также не решает вашу проблему … который вы все еще не полностью описали.

Ответ №3:

Изменить for row in sheet.col(2) на for row in sheet.col(2).value .
U избавится от типа файла do и получит фактическое значение. Сделайте это.

results =[]

for row in sheet.col(2).value:
print(row)