Как я могу открыть файл Excel в Python?

87

Как открыть файл Excel для чтения в Python?

Я открывал текстовые файлы, например, sometextfile.txtкомандой чтения. Как это сделать для файла Excel?

новак
источник
2
Какая версия Excel? Если вы можете ограничиться открытием файлов Excel, созданных Ecel 2007 или 2010, вы сможете анализировать большую часть или весь файл как XML.
Adam Crossland,

Ответы:

97

Изменить:
в более новой версии pandas вы можете передать имя листа в качестве параметра.

file_name =  # path to file + file name
sheet =  # sheet name or sheet number or list of sheet numbers and names

import pandas as pd
df = pd.read_excel(io=file_name, sheet_name=sheet)
print(df.head(5))  # print first 5 rows of the dataframe

Посмотрите в документации примеры того, как пройти sheet_name:
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html

Старая версия:
вы также можете использовать pandasпакет ....

Когда вы работаете с файлом Excel с несколькими листами, вы можете использовать:

import pandas as pd
xl = pd.ExcelFile(path + filename)
xl.sheet_names

>>> [u'Sheet1', u'Sheet2', u'Sheet3']

df = xl.parse("Sheet1")
df.head()

df.head() напечатает первые 5 строк вашего файла Excel

Если вы работаете с файлом Excel с одним листом, вы можете просто использовать:

import pandas as pd
df = pd.read_excel(path + filename)
print df.head()
Ракеш Адхикесаван
источник
2
это решение получает мою поддержку. с openpyxl у меня возникает следующая проблема: «InvalidFileException: openpyxl не поддерживает старый формат файла .xls, пожалуйста, используйте xlrd для чтения этого файла или конвертируйте его в более свежий формат файла .xlsx». С другой стороны, pandas обрабатывает файлы .xls и .xlsx ... кроме того, чтение всей таблицы занимает всего одну строку кода.
nathanielng
3
Вам потребуется установить дополнительные зависимости xlrdдля чтения файлов Excel и xlwtдля записи файлов Excel.
Flimm 01
32

Попробуйте библиотеку xlrd .

[Edit] - из того, что я вижу из вашего комментария, что-то вроде приведенного ниже фрагмента может помочь. Я предполагаю, что вы просто ищете в одном столбце слово «john», но вы можете добавить больше или превратить его в более общую функцию.

from xlrd import open_workbook

book = open_workbook('simple.xls',on_demand=True)
for name in book.sheet_names():
    if name.endswith('2'):
        sheet = book.sheet_by_name(name)

        # Attempt to find a matching row (search the first column for 'john')
        rowIndex = -1
        for cell in sheet.col(0): # 
            if 'john' in cell.value:
                break

        # If we found the row, print it
        if row != -1:
            cells = sheet.row(row)
            for cell in cells:
                print cell.value

        book.unload_sheet(name) 
Джон Кейдж
источник
Я думаю, что это может быть то, что я хочу сделать: from xlrd import open_workbook book = open_workbook ('simple.xls', on_demand = True) для имени в book.sheet_names (): if name.endswith ('2'): sheet = book.sheet_by_name (name) print sheet.cell_value (0,0) book.unload_sheet (name) large_files.py, но я не хочу, чтобы он использовал конец, я хочу, чтобы он находил и печатал строки, содержащие конкретное имя ... например Я хочу, чтобы он напечатал строку огромного листа Excel, который содержит данные Джона, а не Боба. Помогите?
novak
Я предлагаю вам опубликовать это как отдельный вопрос и поместить код в блок кода.
Джон Кейдж,
Это второй вопрос из серии связанных вопросов; в третьем вопросе выясняется, что реальный файл excel предположительно составляет 1,5 ГБ, а память компьютера описывается как «недостаточно» ... см. stackoverflow.com/questions/3241039/…
Джон Мачин
16

Это не так просто, как открытие простого текстового файла, и для этого потребуется какой-то внешний модуль, поскольку для этого ничего не встроено. Вот несколько вариантов:

http://www.python-excel.org/

Если возможно, вы можете рассмотреть возможность экспорта электронной таблицы Excel в виде файла CSV, а затем использовать встроенный модуль csv python для ее чтения:

http://docs.python.org/library/csv.html

Дональд Майнер
источник
Хорошо, я действительно не понимаю материал CSV, как мне сделать так, чтобы python открыл мой файл Excel как модуль csv? У меня есть программа, которая делает то, что я хочу для файлов txt, и я хочу, чтобы она делала то же самое для этого файла excel ... что лучше всего? Не могли бы вы подробнее рассказать об этом?
novak
Либо вы можете использовать сторонний модуль python, например xlrd, либо сохранить файл Excel в виде CSV-файла вместо обычного файла Excel. Я думаю, что вам не хватает того, что файл Excel не похож на обычный текстовый файл. Откройте документ Excel в блокноте, и вы поймете, что я имею в виду. Вам нужно либо сохранить файл в текстовом формате, таком как CSV (значения, разделенные запятыми), который легче читать с помощью python, либо установить и использовать сторонний модуль, который может анализировать файл Excel за вас.
Дональд Майнер,
Проблема в том, что файл действительно очень большой. Как мне сохранить файл в формате CSV, если я не могу полностью открыть файл?
novak
@novak: Ваша проблема в том, что размер вашего файла 1,5 ГБ, а памяти вашего компьютера «недостаточно» ...
Джон Мачин,
6

Есть пакет openpxyl :

>>> from openpyxl import load_workbook
>>> wb2 = load_workbook('test.xlsx')
>>> print wb2.get_sheet_names()
['Sheet2', 'New Title', 'Sheet1']

>>> worksheet1 = wb2['Sheet1'] # one way to load a worksheet
>>> worksheet2 = wb2.get_sheet_by_name('Sheet2') # another way to load a worksheet
>>> print(worksheet1['D18'].value)
3
>>> for row in worksheet1.iter_rows():
>>>     print row[0].value()
слова
источник
1

Это может помочь:

Это создает узел, который принимает 2D-список (список элементов списка) и помещает их в электронную таблицу Excel. убедитесь, что IN [] присутствуют или вызовут исключение.

это переписывание динамо-узла Revit Excel для Excel 2013, поскольку предварительно упакованный узел по умолчанию постоянно ломался. У меня тоже есть похожий узел чтения. Синтаксис Excel в Python обидчив.

thnx @CodingNinja - обновлено :)

###Export Excel - intended to replace malfunctioning excel node

import clr

clr.AddReferenceByName('Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c')
##AddReferenceGUID("{00020813-0000-0000-C000-000000000046}") ''Excel                            C:\Program Files\Microsoft Office\Office15\EXCEL.EXE 
##Need to Verify interop for version 2015 is 15 and node attachemnt for it.
from Microsoft.Office.Interop import  * ##Excel
################################Initialize FP and Sheet ID
##Same functionality as the excel node
strFileName = IN[0]             ##Filename
sheetName = IN[1]               ##Sheet
RowOffset= IN[2]                ##RowOffset
ColOffset= IN[3]                ##COL OFfset
Data=IN[4]                      ##Data
Overwrite=IN[5]                 ##Check for auto-overwtite
XLVisible = False   #IN[6]      ##XL Visible for operation or not?

RowOffset=0
if IN[2]>0:
    RowOffset=IN[2]             ##RowOffset

ColOffset=0
if IN[3]>0:
    ColOffset=IN[3]             ##COL OFfset

if IN[6]<>False:
    XLVisible = True #IN[6]     ##XL Visible for operation or not?

################################Initialize FP and Sheet ID
xlCellTypeLastCell = 11                 #####define special sells value constant
################################
xls = Excel.ApplicationClass()          ####Connect with application
xls.Visible = XLVisible                 ##VISIBLE YES/NO
xls.DisplayAlerts = False               ### ALerts

import os.path

if os.path.isfile(strFileName):
    wb = xls.Workbooks.Open(strFileName, False)     ####Open the file 
else:
    wb = xls.Workbooks.add#         ####Open the file 
    wb.SaveAs(strFileName)
wb.application.visible = XLVisible      ####Show Excel
try:
    ws = wb.Worksheets(sheetName)       ####Get the sheet in the WB base

except:
    ws = wb.sheets.add()                ####If it doesn't exist- add it. use () for object method
    ws.Name = sheetName



#################################
#lastRow for iterating rows
lastRow=ws.UsedRange.SpecialCells(xlCellTypeLastCell).Row
#lastCol for iterating columns
lastCol=ws.UsedRange.SpecialCells(xlCellTypeLastCell).Column
#######################################################################
out=[]                                  ###MESSAGE GATHERING

c=0
r=0
val=""
if Overwrite == False :                 ####Look ahead for non-empty cells to throw error
    for r, row in enumerate(Data):   ####BASE 0## EACH ROW OF DATA ENUMERATED in the 2D array #range( RowOffset, lastRow + RowOffset):
        for c, col in enumerate (row): ####BASE 0## Each colmn in each row is a cell with data ### in range(ColOffset, lastCol + ColOffset):
            if col.Value2 >"" :
                OUT= "ERROR- Cannot overwrite"
                raise ValueError("ERROR- Cannot overwrite")
##out.append(Data[0]) ##append mesage for error
############################################################################

for r, row in enumerate(Data):   ####BASE 0## EACH ROW OF DATA ENUMERATED in the 2D array #range( RowOffset, lastRow + RowOffset):
    for c, col in enumerate (row): ####BASE 0## Each colmn in each row is a cell with data ### in range(ColOffset, lastCol + ColOffset):
        ws.Cells[r+1+RowOffset,c+1+ColOffset].Value2 = col.__str__()

##run macro disbled for debugging excel macro
##xls.Application.Run("Align_data_and_Highlight_Issues")
Apsis0215
источник
@CodingNinja Этого достаточно? :)
Apsis0215
Да гораздо лучше
0

Этот код работал у меня с Python 3.5.2. Он открывается, сохраняет и преуспевает. В настоящее время я работаю над тем, как сохранить данные в файл, но это код:

import csv
excel = csv.writer(open("file1.csv", "wb"))

 

J.ravat
источник
-1
import pandas as pd 
import os 
files = os.listdir('path/to/files/directory/')
desiredFile = files[i]
filePath = 'path/to/files/directory/%s'
Ofile = filePath % desiredFile
xls_import = pd.read_csv(Ofile)

Теперь вы можете использовать возможности pandas DataFrames!

Малькольм Монро
источник
1
Речь идет о чтении файла Excel, а не текстового файла, разделенного запятыми. У Pandas есть функция для этого ( pandas.read_excel).
Барт