Cách tốt nhất để đọc tệp Excel (XLS) bằng Python (không phải tệp CSV ) là gì.
Có gói tích hợp nào được hỗ trợ theo mặc định bằng Python để thực hiện tác vụ này không?
Cách tốt nhất để đọc tệp Excel (XLS) bằng Python (không phải tệp CSV ) là gì.
Có gói tích hợp nào được hỗ trợ theo mặc định bằng Python để thực hiện tác vụ này không?
Câu trả lời:
Tôi thực sự khuyên bạn nên xlrd để đọc .xls
tệp.
voyager đã đề cập đến việc sử dụng tự động hóa COM. Bản thân tôi đã làm điều này một vài năm trước, hãy cảnh báo rằng làm điều này là một PITA thực sự. Số lượng cảnh báo là rất lớn và tài liệu thiếu và gây khó chịu. Tôi đã gặp phải nhiều lỗi và lỗi kỳ lạ, một số trong số đó mất nhiều giờ để tìm ra.
CẬP NHẬT: Đối với các .xlsx
tệp mới hơn , thư viện được đề xuất để đọc và ghi dường như là openpyxl (cảm ơn, Ikar Pohorský).
.xlsx
), bạn có thể sẽ sử dụng OpenPyXL .
Sử dụng gấu trúc:
import pandas as pd
xls = pd.ExcelFile("yourfilename.xls")
sheetX = xls.parse(2) #2 is the sheet number
var1 = sheetX['ColumnName']
print(var1[1]) #1 is the row number...
Bạn có thể chọn bất kỳ một trong số chúng http://www.python-excel.org/
Tôi muốn giới thiệu thư viện xlrd python.
cài đặt nó bằng cách sử dụng
pip install xlrd
nhập khẩu bằng cách sử dụng
import xlrd
để mở một sổ làm việc
workbook = xlrd.open_workbook('your_file_name.xlsx')
mở trang tính theo tên
worksheet = workbook.sheet_by_name('Name of the Sheet')
mở trang tính theo chỉ mục
worksheet = workbook.sheet_by_index(0)
đọc giá trị ô
worksheet.cell(0, 0).value
Tôi nghĩ Pandas là cách tốt nhất để đi. Đã có một câu trả lời ở đây với ExcelFile
chức năng sử dụng Pandas , nhưng nó không hoạt động đúng với tôi. Từ đây tôi thấy read_excel
chức năng hoạt động tốt:
import pandas as pd
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name")
print(dfs.head(10))
PS Bạn cần xlrd
cài đặt để read_excel
chức năng hoạt động
Cập nhật 21-03-2020: Như bạn có thể thấy ở đây , có vấn đề với xlrd
công cụ và nó sẽ không được dùng nữa. Là openpyxl
sự thay thế tốt nhất. Vì vậy, như được mô tả ở đây , cú pháp chuẩn phải là:
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name", engine="openpyxl")
Đối với xlsx, tôi thích giải pháp được đăng trước đó là https://web.archive.org/web/20180216070531//programming/4371163/reading-xlsx-files-using-python . Tôi chỉ sử dụng các mô-đun từ thư viện tiêu chuẩn.
def xlsx(fname):
import zipfile
from xml.etree.ElementTree import iterparse
z = zipfile.ZipFile(fname)
strings = [el.text for e, el in iterparse(z.open('xl/sharedStrings.xml')) if el.tag.endswith('}t')]
rows = []
row = {}
value = ''
for e, el in iterparse(z.open('xl/worksheets/sheet1.xml')):
if el.tag.endswith('}v'): # Example: <v>84</v>
value = el.text
if el.tag.endswith('}c'): # Example: <c r="A3" t="s"><v>84</v></c>
if el.attrib.get('t') == 's':
value = strings[int(value)]
letter = el.attrib['r'] # Example: AZ22
while letter[-1].isdigit():
letter = letter[:-1]
row[letter] = value
value = ''
if el.tag.endswith('}row'):
rows.append(row)
row = {}
return rows
Các cải tiến được thêm vào là tìm nạp nội dung theo tên trang tính, sử dụng re để lấy cột và kiểm tra xem các chuỗi chia sẻ có được sử dụng hay không.
def xlsx(fname,sheet):
import zipfile
from xml.etree.ElementTree import iterparse
import re
z = zipfile.ZipFile(fname)
if 'xl/sharedStrings.xml' in z.namelist():
# Get shared strings
strings = [element.text for event, element
in iterparse(z.open('xl/sharedStrings.xml'))
if element.tag.endswith('}t')]
sheetdict = { element.attrib['name']:element.attrib['sheetId'] for event,element in iterparse(z.open('xl/workbook.xml'))
if element.tag.endswith('}sheet') }
rows = []
row = {}
value = ''
if sheet in sheets:
sheetfile = 'xl/worksheets/sheet'+sheets[sheet]+'.xml'
#print(sheet,sheetfile)
for event, element in iterparse(z.open(sheetfile)):
# get value or index to shared strings
if element.tag.endswith('}v') or element.tag.endswith('}t'):
value = element.text
# If value is a shared string, use value as an index
if element.tag.endswith('}c'):
if element.attrib.get('t') == 's':
value = strings[int(value)]
# split the row/col information so that the row leter(s) can be separate
letter = re.sub('\d','',element.attrib['r'])
row[letter] = value
value = ''
if element.tag.endswith('}row'):
rows.append(row)
row = {}
return rows
Bạn có thể sử dụng bất kỳ thư viện nào được liệt kê ở đây (như Pyxlreader dựa trên JExcelApi hoặc xlwt ), cộng với tự động hóa COM để sử dụng chính Excel để đọc các tệp, nhưng bạn đang giới thiệu Office như một phần phụ thuộc của phần mềm của mình, mà có thể không phải lúc nào cũng là một lựa chọn.
xlwt
Tệp WriTes; sử dụng xlrd
cho các tệp ReaD.
Nếu bạn cần định dạng XLS cũ. Dưới đây là mã cho ansii 'cp1251'.
import xlrd
file=u'C:/Landau/task/6200.xlsx'
try:
book = xlrd.open_workbook(file,encoding_override="cp1251")
except:
book = xlrd.open_workbook(file)
print("The number of worksheets is {0}".format(book.nsheets))
print("Worksheet name(s): {0}".format(book.sheet_names()))
sh = book.sheet_by_index(0)
print("{0} {1} {2}".format(sh.name, sh.nrows, sh.ncols))
print("Cell D30 is {0}".format(sh.cell_value(rowx=29, colx=3)))
for rx in range(sh.nrows):
print(sh.row(rx))
Python Excelerator cũng xử lý tác vụ này. http://ghantoos.org/2007/10/25/python-pyexcelerator-small-howto/
Nó cũng có sẵn trong Debian và Ubuntu:
sudo apt-get install python-excelerator
Bạn cũng có thể cân nhắc chạy chương trình (không phải python) xls2csv. Cung cấp cho nó một tệp xls và bạn sẽ nhận lại một csv.
xls2csv
, sau đó phân tích cú pháp csv
từ Python?
Đối với các tệp Excel cũ hơn, có mô-đun OleFileIO_PL có thể đọc định dạng lưu trữ có cấu trúc OLE được sử dụng.
with open(csv_filename) as file:
data = file.read()
with open(xl_file_name, 'w') as file:
file.write(data)
Bạn có thể biến CSV thành excel như trên bằng các gói có sẵn. CSV có thể được xử lý bằng một gói trình đọc và viết có sẵn sẽ hoạt động giống như cách hoạt động của từ điển python. điều này làm cho nó dễ dàng hơn rất nhiều Tôi hiện không biết về bất kỳ gói sẵn có nào cho excel nhưng tôi đã gặp openpyxl. Nó cũng khá dễ hiểu và đơn giản. Bạn có thể xem đoạn mã bên dưới, hy vọng điều này sẽ hữu ích
import openpyxl
book = openpyxl.load_workbook(filename)
sheet = book.active
result =sheet['AP2']
print(result.value)