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