@voyager: он хочет ЧИТАТЬ файлы, а не записывать их
Джон Мачин,
Ответы:
92
Я настоятельно рекомендую xlrd для чтения .xlsфайлов.
voyager упомянул об использовании автоматизации COM. Сделав это сам несколько лет назад, имейте в виду, что это настоящая PITA. Количество замечаний огромно, а документации не хватает и это раздражает. Я столкнулся с множеством странных ошибок и ошибок, на выяснение некоторых из которых потребовалось много часов.
ОБНОВЛЕНИЕ: для более новых .xlsxфайлов рекомендуемая библиотека для чтения и записи - openpyxl (спасибо, Икар Погорски).
Для файлов Excel 2007+ ( .xlsx) вы, вероятно, будете использовать OpenPyXL .
Икар Погорски
48
Использование панд:
import pandas as pd
xls = pd.ExcelFile("yourfilename.xls")
sheetX = xls.parse(2)#2 is the sheet number
var1 = sheetX['ColumnName']print(var1[1])#1 is the row number...
«Прочитанное значение ячейки» не работает ... вызывает ошибку TypeError: объект «Лист» не может быть вызван. Все остальное отлично поработало.
Newbielp
14
Я думаю, что Pandas - лучший выход. Существует уже один ответ здесь с панды , используя ExcelFileфункцию, но она не работает должным образом для меня. Из здесь я нашел read_excelфункцию , которая работает просто отлично:
import pandas as pd
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name")print(dfs.head(10))
PS У вас должен быть xlrdустановлен, чтобы read_excelфункция работала
Обновление 21-03-2020: Как вы можете видеть здесь , есть проблемы с xlrdдвижком, и он будет устаревшим. openpyxlЯвляется лучшей заменой. Итак, как описано здесь , канонический синтаксис должен быть:
def xlsx(fname):import zipfile
from xml.etree.ElementTreeimport iterparse
z = zipfile.ZipFile(fname)
strings =[el.text for e, el in iterparse(z.open('xl/sharedStrings.xml'))if el.tag.endswith('}t')]
rows =[]
row ={}
value =''for e, el in iterparse(z.open('xl/worksheets/sheet1.xml')):if el.tag.endswith('}v'):# Example: <v>84</v>
value = el.text
if el.tag.endswith('}c'):# Example: <c r="A3" t="s"><v>84</v></c> if el.attrib.get('t')=='s':
value = strings[int(value)]
letter = el.attrib['r']# Example: AZ22 while letter[-1].isdigit():
letter = letter[:-1]
row[letter]= value
value =''if el.tag.endswith('}row'):
rows.append(row)
row ={}return rows
Добавлены улучшения: выборка содержимого по имени листа, использование re для получения столбца и проверка использования общих строк.
def xlsx(fname,sheet):import zipfile
from xml.etree.ElementTreeimport iterparse
import re
z = zipfile.ZipFile(fname)if'xl/sharedStrings.xml'in z.namelist():# Get shared strings
strings =[element.text for event, element
in iterparse(z.open('xl/sharedStrings.xml'))if element.tag.endswith('}t')]
sheetdict ={ element.attrib['name']:element.attrib['sheetId']for event,element in iterparse(z.open('xl/workbook.xml'))if element.tag.endswith('}sheet')}
rows =[]
row ={}
value =''if sheet in sheets:
sheetfile ='xl/worksheets/sheet'+sheets[sheet]+'.xml'#print(sheet,sheetfile)for event, element in iterparse(z.open(sheetfile)):# get value or index to shared stringsif element.tag.endswith('}v')or element.tag.endswith('}t'):
value = element.text
# If value is a shared string, use value as an indexif element.tag.endswith('}c'):if element.attrib.get('t')=='s':
value = strings[int(value)]# split the row/col information so that the row leter(s) can be separate
letter = re.sub('\d','',element.attrib['r'])
row[letter]= value
value =''if element.tag.endswith('}row'):
rows.append(row)
row ={}return rows
Вы можете использовать любую из перечисленных здесь библиотек (например, Pyxlreader , основанный на JExcelApi или xlwt ), а также автоматизацию COM, чтобы использовать сам Excel для чтения файлов, но для этого вы представляете Office как зависимость от вашего программного обеспечения, что не всегда может быть вариантом.
(1) pyxlreader - это абсолютная оспа. Вы, должно быть, никогда не пробовали. Смотрите мои комментарии здесь: stackoverflow.com/questions/1243545/… (2) xlwtфайлы WriTes; использовать xlrdдля файлов ReaD.
Джон Мачин,
2
Если вам нужен старый формат XLS. Ниже код для ansii 'cp1251'.
import xlrd
file=u'C:/Landau/task/6200.xlsx'try:
book = xlrd.open_workbook(file,encoding_override="cp1251")except:
book = xlrd.open_workbook(file)print("The number of worksheets is {0}".format(book.nsheets))print("Worksheet name(s): {0}".format(book.sheet_names()))
sh = book.sheet_by_index(0)print("{0} {1} {2}".format(sh.name, sh.nrows, sh.ncols))print("Cell D30 is {0}".format(sh.cell_value(rowx=29, colx=3)))for rx in range(sh.nrows):print(sh.row(rx))
with open(csv_filename)as file:
data = file.read()with open(xl_file_name,'w')as file:
file.write(data)
Вы можете превратить CSV в Excel, как указано выше, с помощью встроенных пакетов. CSV можно обрабатывать с помощью встроенного пакета dictreader и dictwriter, который будет работать так же, как работает словарь Python. что упрощает задачу. В настоящее время я не знаю ни о каких встроенных пакетах для Excel, но я наткнулся на openpyxl. Это также было довольно просто и понятно. Вы можете увидеть фрагмент кода ниже, надеюсь, это поможет.
import openpyxl
book = openpyxl.load_workbook(filename)
sheet = book.active
result =sheet['AP2']print(result.value)
либо вы можете использовать его xlrdнапрямую, импортировав его. Как показано ниже
import xlrd
wb = xlrd.open_workbook(file_name)
Или вы также можете использовать pd.read_excel()метод pandas , но не забудьте указать движок, хотя по умолчанию xlrdон должен быть указан.
pd.read_excel(file_name, engine = xlrd)
Оба они работают с более старыми .xlsформатами файлов. Фактически, я столкнулся с этим, когда использовал OpenPyXL, я получил ошибку ниже
InvalidFileException: openpyxl does not support the old .xls file format, please use xlrd to read this file,or convert it to the more recent .xlsx file format.
Ответы:
Я настоятельно рекомендую xlrd для чтения
.xls
файлов.voyager упомянул об использовании автоматизации COM. Сделав это сам несколько лет назад, имейте в виду, что это настоящая PITA. Количество замечаний огромно, а документации не хватает и это раздражает. Я столкнулся с множеством странных ошибок и ошибок, на выяснение некоторых из которых потребовалось много часов.
ОБНОВЛЕНИЕ: для более новых
.xlsx
файлов рекомендуемая библиотека для чтения и записи - openpyxl (спасибо, Икар Погорски).источник
.xlsx
) вы, вероятно, будете использовать OpenPyXL .Использование панд:
источник
Вы можете выбрать любой из них http://www.python-excel.org/
Я бы порекомендовал библиотеку python xlrd.
установить его с помощью
импорт с использованием
открыть книгу
открыть лист по имени
открыть лист по индексу
прочитать значение ячейки
источник
Я думаю, что Pandas - лучший выход. Существует уже один ответ здесь с панды , используя
ExcelFile
функцию, но она не работает должным образом для меня. Из здесь я нашелread_excel
функцию , которая работает просто отлично:PS У вас должен быть
xlrd
установлен, чтобыread_excel
функция работалаОбновление 21-03-2020: Как вы можете видеть здесь , есть проблемы с
xlrd
движком, и он будет устаревшим.openpyxl
Является лучшей заменой. Итак, как описано здесь , канонический синтаксис должен быть:источник
Для xlsx мне нравится решение, опубликованное ранее как https://web.archive.org/web/20180216070531//programming/4371163/reading-xlsx-files-using-python . Я использую только модули из стандартной библиотеки.
Добавлены улучшения: выборка содержимого по имени листа, использование re для получения столбца и проверка использования общих строк.
источник
Вы можете использовать любую из перечисленных здесь библиотек (например, Pyxlreader , основанный на JExcelApi или xlwt ), а также автоматизацию COM, чтобы использовать сам Excel для чтения файлов, но для этого вы представляете Office как зависимость от вашего программного обеспечения, что не всегда может быть вариантом.
источник
xlwt
файлы WriTes; использоватьxlrd
для файлов ReaD.Если вам нужен старый формат XLS. Ниже код для ansii 'cp1251'.
источник
Python Excelerator также справляется с этой задачей. http://ghantoos.org/2007/10/25/python-pyexcelerator-small-howto/
Он также доступен в Debian и Ubuntu:
источник
Вы также можете рассмотреть возможность запуска программы xls2csv (не на языке Python). Подайте ему файл xls, и вы должны получить обратно CSV.
источник
xls2csv
, а затем разобратьcsv
из Python?Для старых файлов Excel существует модуль OleFileIO_PL, который может читать используемый формат структурированного хранения OLE.
источник
Вы можете превратить CSV в Excel, как указано выше, с помощью встроенных пакетов. CSV можно обрабатывать с помощью встроенного пакета dictreader и dictwriter, который будет работать так же, как работает словарь Python. что упрощает задачу. В настоящее время я не знаю ни о каких встроенных пакетах для Excel, но я наткнулся на openpyxl. Это также было довольно просто и понятно. Вы можете увидеть фрагмент кода ниже, надеюсь, это поможет.
источник
Для старых
.xls
файлов вы можете использоватьxlrd
либо вы можете использовать его
xlrd
напрямую, импортировав его. Как показано нижеИли вы также можете использовать
pd.read_excel()
метод pandas , но не забудьте указать движок, хотя по умолчаниюxlrd
он должен быть указан.Оба они работают с более старыми
.xls
форматами файлов. Фактически, я столкнулся с этим, когда использовалOpenPyXL
, я получил ошибку нижеисточник