Która wersja programu Excel? Jeśli możesz ograniczyć się do otwierania plików Excela utworzonych przez Ecel 2007 lub 2010, powinieneś być w stanie przeanalizować większość lub całość pliku jako XML.
Adam Crossland
Odpowiedzi:
97
Edycja:
W nowszej wersji pand możesz przekazać nazwę arkusza jako parametr.
file_name = # path to file + file name
sheet = # sheet name or sheet number or list of sheet numbers and namesimport pandas as pd
df = pd.read_excel(io=file_name, sheet_name=sheet)
print(df.head(5)) # print first 5 rows of the dataframe
to rozwiązanie cieszy się moim uznaniem. z openpyxl napotykam następujący problem: „InvalidFileException: openpyxl nie obsługuje starego formatu pliku .xls, użyj xlrd do odczytania tego pliku lub przekonwertuj go na nowszy format .xlsx”. Z drugiej strony pandy obsługują zarówno pliki .xls, jak i .xlsx ... również odczyt całej tabeli zajmuje tylko jedną linię kodu.
nathanielng
3
Będziesz musiał zainstalować opcjonalne zależności xlrddo odczytu plików Excela i xlwtdo pisania plików Excel.
[Edytuj] - z tego, co widzę po Twoim komentarzu, coś takiego jak poniższy fragment może załatwić sprawę. Zakładam, że szukasz słowa „jan” w jednej kolumnie, ale możesz dodać więcej lub uczynić z tego bardziej ogólną funkcję.
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 = -1for cell in sheet.col(0): # if'john'in cell.value:
break# If we found the row, print itif row != -1:
cells = sheet.row(row)
for cell in cells:
print cell.value
book.unload_sheet(name)
Myślę, że to może być to, co chcę zrobić: from xlrd import open_workbook book = open_workbook ('simple.xls', on_demand = True) dla nazwy w 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, ale nie chcę, aby używał endwith, chcę, aby znajdował i drukował wiersze zawierające konkretną nazwę ... na przykład Chcę, żeby wydrukowało wiersz ogromnego arkusza Excela, który zawiera dane Johna, a nie Boba. Wsparcie?
novak
Proponuję opublikować to jako oddzielne pytanie i umieścić kod w bloku kodu.
Jon Cage,
To jest drugie pytanie z serii powiązanych pytań; w trzecim pytaniu okazuje się, że prawdziwy plik Excela ma rzekomo 1,5 GB, a pamięć komputera jest opisana jako „za mało” ... patrz stackoverflow.com/questions/3241039/ ...
John Machin
16
Nie jest to tak proste, jak otwieranie zwykłego pliku tekstowego i będzie wymagało jakiegoś zewnętrznego modułu, ponieważ nic nie jest do tego wbudowane. Oto kilka opcji:
Jeśli to możliwe, możesz rozważyć wyeksportowanie arkusza kalkulacyjnego Excela jako pliku CSV, a następnie użycie wbudowanego modułu csv w języku Python, aby go przeczytać:
Ok, naprawdę nie rozumiem rzeczy CSV, jak mam Pythona otworzyć mój plik Excela jako moduł csv? Mam program, który robi to, co chcę dla plików txt i chcę, aby robił to samo z tym plikiem Excela ... co jest najlepszym sposobem? Czy możesz to rozwinąć?
novak
Możesz użyć zewnętrznego modułu Pythona, takiego jak xlrd, lub zapisać plik Excela w pliku CSV zamiast zwykłego pliku Excel. Myślę, że brakuje ci tego, że plik Excela nie ma żadnego podobieństwa do zwykłego pliku tekstowego. Otwórz dokument Excela w notatniku, a zobaczysz, co mam na myśli. Musisz albo zapisać plik w formacie zwykłego tekstu, na przykład CSV (wartości rozdzielane przecinkami), który jest łatwiejszy do odczytania w Pythonie, albo zainstalować i używać modułu innej firmy, który może przeanalizować plik Excela.
Donald Miner
Problem polega na tym, że plik jest naprawdę duży. Jak mogę zapisać plik w formacie CSV, jeśli nie mogę go całkowicie otworzyć?
novak
@novak: Twoim problemem jest to, że plik ma 1,5 GB, a pamięć komputera jest „niewystarczająca” ...
>>> 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()
Tworzy to węzeł, który pobiera listę 2D (listę elementów listy) i wypycha je do arkusza kalkulacyjnego programu Excel. upewnij się, że IN [] są obecne lub rzucą i wyjątek.
jest to ponowne zapisanie węzła dynamo Revit excel dla programu Excel 2013, ponieważ domyślny wstępnie spakowany węzeł ciągle się psuje. Mam też podobny węzeł odczytu. Składnia programu Excel w Pythonie jest drażliwa.
thnx @CodingNinja - zaktualizowano:)
###Export Excel - intended to replace malfunctioning excel nodeimport 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=0if IN[2]>0:
RowOffset=IN[2] ##RowOffset
ColOffset=0if IN[3]>0:
ColOffset=IN[3] ##COL OFfsetif 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### ALertsimport 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 Exceltry:
ws = wb.Worksheets(sheetName) ####Get the sheet in the WB baseexcept:
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 errorfor r, row inenumerate(Data): ####BASE 0## EACH ROW OF DATA ENUMERATED in the 2D array #range( RowOffset, lastRow + RowOffset):for c, col inenumerate (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 inenumerate(Data): ####BASE 0## EACH ROW OF DATA ENUMERATED in the 2D array #range( RowOffset, lastRow + RowOffset):for c, col inenumerate (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")
Odpowiedzi:
Edycja:
W nowszej wersji pand możesz przekazać nazwę arkusza jako parametr.
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
Sprawdź dokumentację, aby zapoznać się z przykładami, jak przejść
sheet_name
:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html
Stara wersja:
możesz również użyć
pandas
pakietu ...Kiedy pracujesz z plikiem Excela z wieloma arkuszami, możesz użyć:
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()
wydrukuje pierwsze 5 wierszy pliku ExcelJeśli pracujesz z plikiem Excela z jednym arkuszem, możesz po prostu użyć:
import pandas as pd df = pd.read_excel(path + filename) print df.head()
źródło
xlrd
do odczytu plików Excela ixlwt
do pisania plików Excel.Wypróbuj bibliotekę xlrd .
[Edytuj] - z tego, co widzę po Twoim komentarzu, coś takiego jak poniższy fragment może załatwić sprawę. Zakładam, że szukasz słowa „jan” w jednej kolumnie, ale możesz dodać więcej lub uczynić z tego bardziej ogólną funkcję.
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)
źródło
Nie jest to tak proste, jak otwieranie zwykłego pliku tekstowego i będzie wymagało jakiegoś zewnętrznego modułu, ponieważ nic nie jest do tego wbudowane. Oto kilka opcji:
http://www.python-excel.org/
Jeśli to możliwe, możesz rozważyć wyeksportowanie arkusza kalkulacyjnego Excela jako pliku CSV, a następnie użycie wbudowanego modułu csv w języku Python, aby go przeczytać:
http://docs.python.org/library/csv.html
źródło
Jest pakiet 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()
źródło
Możesz użyć pakietu xlpython, który wymaga tylko xlrd. Znajdź go tutaj https://pypi.python.org/pypi/xlpython i jego dokumentację tutaj https://github.com/morfat/xlpython
źródło
To może pomóc:
Tworzy to węzeł, który pobiera listę 2D (listę elementów listy) i wypycha je do arkusza kalkulacyjnego programu Excel. upewnij się, że IN [] są obecne lub rzucą i wyjątek.
jest to ponowne zapisanie węzła dynamo Revit excel dla programu Excel 2013, ponieważ domyślny wstępnie spakowany węzeł ciągle się psuje. Mam też podobny węzeł odczytu. Składnia programu Excel w Pythonie jest drażliwa.
thnx @CodingNinja - zaktualizowano:)
###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")
źródło
Ten kod działał dla mnie z Pythonem 3.5.2. Otwiera, zapisuje i wyróżnia się. Obecnie pracuję nad zapisaniem danych do pliku, ale to jest kod:
import csv excel = csv.writer(open("file1.csv", "wb"))
źródło
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)
Teraz możesz wykorzystać moc pand DataFrames!
źródło
pandas.read_excel
).