Làm cách nào để mở tệp Excel bằng Python?


87

Làm cách nào để mở tệp là tệp Excel để đọc bằng Python?

Ví dụ, tôi đã mở các tệp văn bản sometextfile.txtbằng lệnh đọc. Làm cách nào để thực hiện điều đó cho tệp Excel?


2
Phiên bản nào của Excel? Nếu bạn có thể tự giới hạn việc mở các tệp Excel được tạo bởi Ecel 2007 hoặc 2010, bạn sẽ có thể phân tích cú pháp phần lớn hoặc tất cả tệp dưới dạng XML.
Adam Crossland

Câu trả lời:


97

Chỉnh sửa:
Trong phiên bản gấu trúc mới hơn, bạn có thể chuyển tên trang tính làm tham số.

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

Kiểm tra tài liệu để biết ví dụ về cách vượt qua sheet_name:
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html

Phiên bản cũ:
bạn cũng có thể sử dụng pandasgói ….

Khi bạn đang làm việc với một tệp excel có nhiều trang tính, bạn có thể sử dụng:

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() sẽ in 5 hàng đầu tiên của tệp Excel của bạn

Nếu bạn đang làm việc với tệp Excel với một trang tính, bạn chỉ cần sử dụng:

import pandas as pd
df = pd.read_excel(path + filename)
print df.head()

2
giải pháp này nhận được sự ủng hộ của tôi. với openpyxl, tôi đang gặp phải sự cố sau "InvalidFileException: openpyxl không hỗ trợ định dạng tệp .xls cũ, vui lòng sử dụng xlrd để đọc tệp này hoặc chuyển đổi nó sang định dạng tệp .xlsx mới hơn". Mặt khác, gấu trúc xử lý cả tệp .xls và .xlsx ... ngoài ra, đọc toàn bộ bảng chỉ cần một dòng mã.
nathanielng

3
Bạn sẽ cần cài đặt các phụ thuộc tùy chọn xlrd để đọc tệp Excel và xlwtghi tệp Excel.
Flimm

32

Hãy thử thư viện xlrd .

[Chỉnh sửa] - từ những gì tôi có thể thấy từ nhận xét của bạn, một cái gì đó giống như đoạn mã bên dưới có thể thực hiện một mẹo nhỏ. Tôi giả sử ở đây rằng bạn chỉ đang tìm kiếm một cột cho từ 'john', nhưng bạn có thể thêm nhiều hơn hoặc biến điều này thành một hàm chung chung hơn.

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) 

Tôi nghĩ đây có thể là những gì tôi muốn nó làm: từ xlrd nhập open_workbook book = open_workbook ('simple.xls', on_demand = True) cho tên trong 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 nhưng tôi không muốn nó sử dụng endwi vì tôi muốn nó tìm và in các dòng có chứa một tên cụ thể ... như tôi muốn nó in dòng của trang tính excel khổng lồ chứa dữ liệu của john chứ không phải của bob. Cứu giúp?
novak

Tôi khuyên bạn nên đăng điều này dưới dạng một câu hỏi riêng biệt và đặt mã vào một khối mã.
Jon Cage

Đây là câu hỏi thứ hai trong một loạt các câu hỏi liên quan; trong câu hỏi thứ 3 nó được tiết lộ rằng file excel thực sự là bị cáo buộc 1,5 GB và bộ nhớ của máy tính được mô tả là "không đủ" ... thấy stackoverflow.com/questions/3241039/...
John Machin

16

Điều này không đơn giản như mở một tệp văn bản thuần túy và sẽ yêu cầu một số loại mô-đun bên ngoài vì không có gì được tích hợp sẵn để thực hiện việc này. Dưới đây là một số tùy chọn:

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

Nếu có thể, bạn có thể muốn xem xét xuất bảng tính excel dưới dạng tệp CSV và sau đó sử dụng mô-đun csv python tích hợp sẵn để đọc nó:

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


Được rồi, tôi không thực sự hiểu nội dung CSV làm cách nào để python mở tệp excel của tôi dưới dạng mô-đun csv? Tôi có một chương trình thực hiện những gì tôi muốn cho các tệp txt và tôi muốn nó làm điều tương tự cho tệp excel này ... cách tốt nhất để thực hiện là gì? Bạn có thể nói rõ hơn về điều này được không?
novak

Bạn có thể sử dụng mô-đun python của bên thứ 3 như xlrd hoặc lưu tệp excel của bạn thành tệp CSV, thay vì tệp Excel bình thường. Tôi nghĩ rằng điểm bạn đang thiếu là một tệp excel không giống với một tệp văn bản thuần túy. Mở tài liệu Excel trong notepad và bạn sẽ hiểu ý tôi. Bạn cần phải lưu tệp ở định dạng văn bản thuần túy như CSV (các giá trị được phân tách bằng dấu phẩy), dễ đọc hơn với python hoặc cài đặt và sử dụng mô-đun của bên thứ ba có thể phân tích cú pháp tệp Excel cho bạn.
Donald Miner,

Vấn đề tôi đang gặp phải là tệp thực sự rất lớn. Làm cách nào để lưu tệp dưới định dạng CSV nếu tôi không thể mở hoàn toàn tệp?
novak

@novak: Vấn đề của bạn là tập tin của bạn là 1,5 GB và bộ nhớ máy tính của bạn là "không đủ" ...
John Machin

6

Có gói 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

Điều này có thể giúp:

Thao tác này tạo một nút lấy Danh sách 2D (danh sách các mục trong danh sách) và đẩy chúng vào bảng tính excel. đảm bảo IN [] có mặt hoặc sẽ ném và ngoại lệ.

đây là bản viết lại của nút động trong Revit excel cho excel 2013 vì nút đóng gói trước mặc định liên tục bị hỏng. Tôi cũng có một nút đọc tương tự. Cú pháp excel trong Python khá phức tạp.

thnx @CodingNinja - đã cập nhật:)

###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 Đủ chưa? :)
Apsis0215

Có tốt hơn nhiều

0

Mã này hoạt động với tôi với Python 3.5.2. Nó mở và lưu và vượt trội. Tôi hiện đang nghiên cứu cách lưu dữ liệu vào tệp nhưng đây là mã:

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)

Bây giờ bạn có thể sử dụng sức mạnh của DataFrames gấu trúc!


1
Câu hỏi là về cách đọc tệp Excel, không phải tệp văn bản được phân tách bằng dấu phẩy. Pandas dường như có một chức năng cho điều đó ( pandas.read_excel).
Bart
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.