Як відкрити файл 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.