Excel (XLS) dosyalarını Python ile ( CSV dosyaları değil) okumanın en iyi yolu nedir ?
Bu görevi gerçekleştirmek için Python'da varsayılan olarak desteklenen yerleşik bir paket var mı?
Excel (XLS) dosyalarını Python ile ( CSV dosyaları değil) okumanın en iyi yolu nedir ?
Bu görevi gerçekleştirmek için Python'da varsayılan olarak desteklenen yerleşik bir paket var mı?
Yanıtlar:
Dosyaları okumak için xlrd'yi şiddetle tavsiye ederim .xls
.
Voyager, COM otomasyonunun kullanımından bahsetti. Bunu birkaç yıl önce kendim yaptım, bunun gerçek bir PITA olduğu konusunda uyarılalım. Uyarıların sayısı çok büyük ve belgeler eksik ve can sıkıcı. Bazılarının çözülmesi saatler süren birçok tuhaf hata ve sorunla karşılaştım.
GÜNCELLEME: Daha yeni .xlsx
dosyalar için, okuma ve yazma için önerilen kitaplık openpyxl olarak görünür (teşekkürler, Ikar Pohorský ).
.xlsx
) için muhtemelen OpenPyXL kullanırsınız .
Pandaları kullanma:
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...
Bunlardan herhangi birini seçebilirsiniz http://www.python-excel.org/
Python xlrd kitaplığını öneririm.
kullanarak kurun
pip install xlrd
kullanarak içe aktar
import xlrd
bir çalışma kitabını açmak için
workbook = xlrd.open_workbook('your_file_name.xlsx')
adıyla sayfa aç
worksheet = workbook.sheet_by_name('Name of the Sheet')
sayfayı dizine göre aç
worksheet = workbook.sheet_by_index(0)
hücre değerini oku
worksheet.cell(0, 0).value
Pandaların gitmenin en iyi yolu olduğunu düşünüyorum. Fonksiyon kullanan Pandalar ile burada zaten bir cevap varExcelFile
, ancak benim için düzgün çalışmadı. Gönderen burada buldum read_excel
sadece para cezası işleri işlevi:
import pandas as pd
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name")
print(dfs.head(10))
PS İşlevin çalışması için xlrd
kurulu olması gerekirread_excel
Güncelleme 21-03-2020: görebileceğiniz gibi burada , ile sorunları vardır xlrd
motoru ve kaldırılacaktır gidiyor. En openpyxl
iyi yedek. Burada açıklandığı gibi , kanonik sözdizimi şöyle olmalıdır:
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name", engine="openpyxl")
Xlsx için daha önce https://web.archive.org/web/20180216070531//programming/4371163/reading-xlsx-files-using-python olarak yayınlanan çözümü beğendim . Yalnızca standart kitaplıktaki modülleri kullanıyorum.
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
Eklenen iyileştirmeler, sayfa adına göre içerik getirme, sütunu almak için yeniden kullanma ve paylaşılan dizelerin kullanılıp kullanılmadığını kontrol etmektir.
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
Burada listelenen kitaplıklardan herhangi birini ( JExcelApi veya xlwt tabanlı Pyxlreader gibi ) ve ayrıca COM otomasyonunu dosyaların okunması için Excel'in kendisini kullanmak üzere kullanabilirsiniz , ancak bunun için Office'i yazılımınızın bağımlılığı olarak tanıtıyorsunuz, bu her zaman bir seçenek olmayabilir.
xlwt
WriTes dosyaları; xlrd
ReaD dosyaları için kullanın .
Eski XLS formatına ihtiyacınız varsa. Ansii 'cp1251' için aşağıdaki kod.
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 bu görevi de yerine getirir. http://ghantoos.org/2007/10/25/python-pyexcelerator-small-howto/
Debian ve Ubuntu'da da mevcuttur:
sudo apt-get install python-excelerator
Ayrıca (python olmayan) xls2csv programını çalıştırmayı da düşünebilirsiniz. Bir xls dosyasıyla besleyin ve bir csv almalısınız.
xls2csv
Çalıştırmayı ve csv
sonra Python'dan ayrıştırmayı mı öneriyorsunuz ?
Daha eski Excel dosyaları için, kullanılan OLE yapılandırılmış depolama biçimini okuyabilen OleFileIO_PL modülü vardır.
with open(csv_filename) as file:
data = file.read()
with open(xl_file_name, 'w') as file:
file.write(data)
CSV'yi dahili paketlerle yukarıdaki gibi mükemmel hale getirebilirsiniz. CSV, python sözlüğünün çalışmasıyla aynı şekilde çalışan yerleşik bir dikt okuyucu ve dikt yazar paketiyle işlenebilir. bu da bunu bir ton kolaylaştırıyor Şu anda excel için herhangi bir dahili paketin farkında değilim, ancak openpyxl ile karşılaştım. Aynı zamanda oldukça basit ve basitti Aşağıdaki kod parçacığını görebilirsiniz, bunun yardımcı olacağını umuyoruz
import openpyxl
book = openpyxl.load_workbook(filename)
sheet = book.active
result =sheet['AP2']
print(result.value)
Daha eski .xls
dosyalar için kullanabilirsinizxlrd
ya xlrd
doğrudan içe aktararak kullanabilirsiniz . Aşağıdaki gibi
import xlrd
wb = xlrd.open_workbook(file_name)
Ya da pandas pd.read_excel()
yöntemini de kullanabilirsiniz , ancak motoru belirtmeyi unutmayın, varsayılan değer olsa xlrd
da belirtilmesi gerekir.
pd.read_excel(file_name, engine = xlrd)
Her ikisi de eski .xls
dosya formatları için çalışır . Infact OpenPyXL
, kullandığımda buna rastladım , aşağıdaki hatayı aldım
InvalidFileException: openpyxl does not support the old .xls file format, please use xlrd to read this file, or convert it to the more recent .xlsx file format.