Apa cara terbaik untuk membaca file Excel (XLS) dengan Python (bukan file CSV ).
Apakah ada paket bawaan yang didukung secara default dengan Python untuk melakukan tugas ini?
Apa cara terbaik untuk membaca file Excel (XLS) dengan Python (bukan file CSV ).
Apakah ada paket bawaan yang didukung secara default dengan Python untuk melakukan tugas ini?
Jawaban:
Saya sangat merekomendasikan xlrd untuk membaca .xls
file.
voyager menyebutkan penggunaan otomatisasi COM. Setelah melakukan ini sendiri beberapa tahun yang lalu, berhati-hatilah karena melakukan ini adalah PITA yang nyata. Jumlah peringatan sangat besar dan dokumentasinya kurang dan mengganggu. Saya menemukan banyak bug dan gotcha aneh, beberapa di antaranya membutuhkan waktu berjam-jam untuk mengetahuinya.
PEMBARUAN: Untuk .xlsx
file yang lebih baru , perpustakaan yang disarankan untuk membaca dan menulis tampaknya openpyxl (terima kasih, Ikar Pohorský).
.xlsx
) Anda mungkin akan menggunakan OpenPyXL .
Menggunakan panda:
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...
Anda dapat memilih salah satu dari mereka http://www.python-excel.org/
Saya akan merekomendasikan pustaka python xlrd.
instal menggunakan
pip install xlrd
impor menggunakan
import xlrd
untuk membuka buku kerja
workbook = xlrd.open_workbook('your_file_name.xlsx')
buka lembar dengan nama
worksheet = workbook.sheet_by_name('Name of the Sheet')
buka lembar demi indeks
worksheet = workbook.sheet_by_index(0)
membaca nilai sel
worksheet.cell(0, 0).value
Saya pikir Panda adalah cara terbaik untuk pergi. Sudah ada satu jawaban di sini dengan Pandas menggunakan ExcelFile
fungsi, tapi tidak bekerja dengan baik untuk saya. Dari sini saya menemukan read_excel
fungsi yang berfungsi dengan baik:
import pandas as pd
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name")
print(dfs.head(10))
PS Anda harus xlrd
menginstal agar read_excel
fungsi dapat bekerja
Pembaruan 21-03-2020: Seperti yang Anda lihat di sini , ada masalah dengan xlrd
mesin dan itu akan ditinggalkan. The openpyxl
adalah pengganti terbaik. Jadi seperti yang dijelaskan di sini , sintaks kanonik harus:
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name", engine="openpyxl")
Untuk xlsx saya suka solusi yang diposting sebelumnya sebagai https://web.archive.org/web/20180216070531//programming/4371163/reading-xlsx-files-using-python . Saya menggunakan modul dari perpustakaan standar saja.
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
Perbaikan yang ditambahkan adalah mengambil konten dengan nama sheet, menggunakan re untuk mendapatkan kolom dan memeriksa apakah string bersama digunakan.
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
Anda dapat menggunakan salah satu pustaka yang tercantum di sini (seperti Pyxlreader yang didasarkan pada JExcelApi, atau xlwt ), ditambah otomatisasi COM untuk menggunakan Excel itu sendiri untuk membaca file, tetapi untuk itu Anda memperkenalkan Office sebagai ketergantungan perangkat lunak Anda, yang mungkin tidak selalu menjadi pilihan.
xlwt
file WriTes; gunakan xlrd
untuk ReaD file.
Jika Anda membutuhkan format XLS lama. Di bawah kode untuk 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 menangani tugas ini juga. http://ghantoos.org/2007/10/25/python-pyexcelerator-small-howto/
Ini juga tersedia di Debian dan Ubuntu:
sudo apt-get install python-excelerator
Anda mungkin juga mempertimbangkan untuk menjalankan program (non-python) xls2csv. Beri makan file xls, dan Anda harus mendapatkan kembali csv.
xls2csv
, lalu mengurai csv
dari Python?
Untuk file Excel yang lebih lama ada modul OleFileIO_PL yang dapat membaca format penyimpanan terstruktur OLE yang digunakan.
with open(csv_filename) as file:
data = file.read()
with open(xl_file_name, 'w') as file:
file.write(data)
Anda dapat mengubah CSV menjadi unggul seperti di atas dengan paket bawaan. CSV dapat ditangani dengan paket built-in dari dictreader dan dictwriter yang akan bekerja dengan cara yang sama seperti kamus python. yang membuatnya sangat mudah Saat ini saya tidak mengetahui adanya paket inbuilt untuk excel tetapi saya telah menemukan openpyxl. Itu juga cukup lurus ke depan dan sederhana Anda dapat melihat potongan kode di bawah ini berharap ini membantu
import openpyxl
book = openpyxl.load_workbook(filename)
sheet = book.active
result =sheet['AP2']
print(result.value)