Як відкрити файл Excel у Python?


87

Як відкрити файл, який є файлом Excel для читання на Python?

Я відкрив текстові файли, наприклад, sometextfile.txtза допомогою команди читання. Як це зробити для файлу Excel?


2
Яка версія Excel? Якщо ви можете обмежитися відкриттям файлів Excel, створених Ecel 2007 або 2010, ви зможете проаналізувати більшу частину або весь файл як XML.
— Адам Кросленд,

Відповіді:


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.
— Флімм

32

Спробуйте бібліотеку xlrd .

[Редагувати] - з того, що я бачу з вашого коментаря, щось на зразок фрагмента нижче може зробити трюк. Тут я припускаю, що ви просто шукаєте в одному стовпці слово «Джон», але ви можете додати більше або перетворити це на більш загальну функцію.

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) 

Я думаю, що це може бути те, що я хочу зробити: з xlrd імпортувати open_workbook book = open_workbook ('simple.xls', on_demand = True) для імені в book.sheet_names (): if name.endswith ('2'): аркуш = book.sheet_by_name (name) print sheet.cell_value (0,0) book.unload_sheet (name) large_files.py, але я не хочу, щоб він використовував endwith, я хочу, щоб він знаходив і друкував рядки, що містять ім'я конкретної інформації ... наприклад я хочу, щоб він надрукував рядок величезного аркуша Excel, який містить дані Джона, а не Бобу. допомогти?
— novak

Я пропоную вам опублікувати це як окреме запитання та помістити код у блок коду.
— Джон Кейдж,

Це друге питання із серії суміжних питань; у 3-му запитанні виявляється, що справжній файл excel нібито становить 1,5 Гб, а пам’ять комп’ютера описується як „недостатня” ... див. stackoverflow.com/questions/3241039/…
— Джон Махін,

16

Це не так просто, як відкриття простого текстового файлу, і для цього знадобиться якийсь зовнішній модуль, оскільки для цього нічого не вбудовано. Ось кілька варіантів:

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

Якщо це можливо, ви можете розглянути можливість експорту таблиці Excel у вигляді файлу CSV, а потім використовувати вбудований модуль python csv для її читання:

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

Це може допомогти:

Це створює вузол, який бере двовимірний список (список елементів списку) і переміщує їх у таблицю 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")

@CodingNinja Цього достатньо? :)
— Apsis0215

Так, набагато краще

0

Цей код працював для мене з Python 3.5.2. Це відкриває, зберігає та перевершує. Зараз я працюю над тим, як зберегти дані у файл, але це код:

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

 


-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.read_excel).
— Барт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.