Versi Excel yang mana? Jika Anda dapat membatasi diri Anda sendiri untuk membuka file Excel yang dibuat oleh Ecel 2007 atau 2010, Anda harus dapat mengurai banyak atau semua file sebagai XML.
Adam Crossland
Jawaban:
97
Sunting:
Di versi panda yang lebih baru, Anda dapat memasukkan nama sheet sebagai parameter.
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
solusi ini mendapatkan suara positif saya. dengan openpyxl, saya mengalami masalah berikut "InvalidFileException: openpyxl tidak mendukung format file .xls lama, gunakan xlrd untuk membaca file ini, atau konversikan ke format file .xlsx yang lebih baru". Di sisi lain, panda menangani file .xls dan .xlsx ... juga, membaca seluruh tabel hanya membutuhkan satu baris kode.
nathanielng
3
Anda perlu menginstal dependensi opsional xlrduntuk membaca file Excel, dan xlwtuntuk menulis file Excel.
[Sunting] - dari apa yang dapat saya lihat dari komentar Anda, sesuatu seperti cuplikan di bawah ini mungkin bisa membantu. Saya berasumsi di sini bahwa Anda hanya mencari satu kolom untuk kata 'john', tetapi Anda dapat menambahkan lebih banyak atau menjadikannya fungsi yang lebih umum.
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)
Saya pikir ini mungkin yang saya ingin lakukan: dari xlrd import open_workbook book = open_workbook ('simple.xls', on_demand = True) untuk nama di 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 tetapi saya tidak ingin menggunakan endwith saya ingin menemukan dan mencetak baris yang berisi nama partikel ... seperti saya ingin mencetak baris lembar excel besar yang berisi data john dan bukan bob. Tolong?
novak
Saya sarankan Anda memposting ini sebagai pertanyaan terpisah dan memasukkan kode ke dalam blok kode.
Jon Cage
Ini adalah pertanyaan kedua dari serangkaian pertanyaan terkait; dalam pertanyaan ke-3 terungkap bahwa file excel yang sebenarnya diduga 1,5 GB dan memori komputer digambarkan sebagai "tidak cukup" ... lihat stackoverflow.com/questions/3241039/…
John Machin
16
Ini tidak semudah membuka file teks biasa dan akan membutuhkan semacam modul eksternal karena tidak ada yang built-in untuk melakukan ini. Berikut beberapa opsinya:
Jika memungkinkan, Anda mungkin ingin mempertimbangkan untuk mengekspor spreadsheet excel sebagai file CSV dan kemudian menggunakan modul csv python built-in untuk membacanya:
Ok saya tidak begitu mengerti tentang CSV bagaimana cara python membuka file excel saya sebagai modul csv? Saya memiliki program yang melakukan apa yang saya inginkan untuk file txt dan saya ingin program itu melakukan hal yang sama untuk file excel ini ... cara mana yang terbaik? Bisakah Anda menjelaskan lebih lanjut tentang ini?
novak
Entah Anda dapat menggunakan modul python pihak ke-3 seperti xlrd, atau menyimpan file excel Anda dalam bentuk file CSV, bukan file Excel biasa. Saya pikir poin yang Anda lewatkan adalah bahwa file excel tidak memiliki kemiripan dengan file teks biasa. Buka dokumen Excel di notepad dan Anda akan melihat apa yang saya maksud. Anda perlu menyimpan file dalam format teks biasa seperti CSV (nilai dipisahkan koma), yang lebih mudah dibaca dengan python, atau menginstal dan menggunakan modul pihak ketiga yang dapat mengurai file Excel untuk Anda.
Donald Miner
Masalah yang saya alami adalah file tersebut sangat besar. Bagaimana cara menyimpan file sebagai format CSV jika saya tidak dapat membuka file sepenuhnya?
novak
@novak: Masalah Anda adalah bahwa file Anda berukuran 1,5GB dan memori komputer Anda "tidak cukup" ...
>>> 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()
Ini membuat node yang mengambil Daftar 2D (daftar item daftar) dan mendorongnya ke dalam spreadsheet excel. pastikan IN [] ada atau akan melempar dan pengecualian.
ini adalah penulisan ulang node dynamo excel Revit untuk excel 2013 karena node default yang telah dikemas terus rusak. Saya juga memiliki node baca yang serupa. Sintaks excel di Python sangat sensitif.
thnx @CodingNinja - diperbarui:)
###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")
Kode ini berfungsi untuk saya dengan Python 3.5.2. Ini membuka dan menyimpan dan unggul. Saat ini saya sedang mengerjakan cara menyimpan data ke dalam file tetapi ini adalah kodenya:
Jawaban:
Sunting:
Di versi panda yang lebih baru, Anda dapat memasukkan nama sheet sebagai parameter.
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
Periksa dokumen untuk mengetahui contoh cara mengirimkan
sheet_name
:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html
Versi lama:
Anda juga dapat menggunakan
pandas
paket ....Saat Anda bekerja dengan file excel dengan banyak lembar, Anda dapat menggunakan:
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()
akan mencetak 5 baris pertama dari file Excel AndaJika Anda bekerja dengan file Excel dengan satu lembar, Anda cukup menggunakan:
import pandas as pd df = pd.read_excel(path + filename) print df.head()
sumber
xlrd
untuk membaca file Excel, danxlwt
untuk menulis file Excel.Coba perpustakaan xlrd .
[Sunting] - dari apa yang dapat saya lihat dari komentar Anda, sesuatu seperti cuplikan di bawah ini mungkin bisa membantu. Saya berasumsi di sini bahwa Anda hanya mencari satu kolom untuk kata 'john', tetapi Anda dapat menambahkan lebih banyak atau menjadikannya fungsi yang lebih umum.
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)
sumber
Ini tidak semudah membuka file teks biasa dan akan membutuhkan semacam modul eksternal karena tidak ada yang built-in untuk melakukan ini. Berikut beberapa opsinya:
http://www.python-excel.org/
Jika memungkinkan, Anda mungkin ingin mempertimbangkan untuk mengekspor spreadsheet excel sebagai file CSV dan kemudian menggunakan modul csv python built-in untuk membacanya:
http://docs.python.org/library/csv.html
sumber
Ada paket 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()
sumber
Anda dapat menggunakan paket xlpython yang hanya membutuhkan xlrd. Temukan di sini https://pypi.python.org/pypi/xlpython dan dokumentasinya di sini https://github.com/morfat/xlpython
sumber
Ini dapat membantu:
Ini membuat node yang mengambil Daftar 2D (daftar item daftar) dan mendorongnya ke dalam spreadsheet excel. pastikan IN [] ada atau akan melempar dan pengecualian.
ini adalah penulisan ulang node dynamo excel Revit untuk excel 2013 karena node default yang telah dikemas terus rusak. Saya juga memiliki node baca yang serupa. Sintaks excel di Python sangat sensitif.
thnx @CodingNinja - diperbarui:)
###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")
sumber
Kode ini berfungsi untuk saya dengan Python 3.5.2. Ini membuka dan menyimpan dan unggul. Saat ini saya sedang mengerjakan cara menyimpan data ke dalam file tetapi ini adalah kodenya:
import csv excel = csv.writer(open("file1.csv", "wb"))
sumber
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)
Sekarang Anda dapat menggunakan kekuatan DataFrames pandas!
sumber
pandas.read_excel
).