Jaki jest najlepszy sposób czytania plików Excel (XLS) w Pythonie (nie plików CSV ).
Czy istnieje pakiet wbudowany, który jest domyślnie obsługiwany w Pythonie do wykonania tego zadania?
Jaki jest najlepszy sposób czytania plików Excel (XLS) w Pythonie (nie plików CSV ).
Czy istnieje pakiet wbudowany, który jest domyślnie obsługiwany w Pythonie do wykonania tego zadania?
Odpowiedzi:
Bardzo polecam xlrd do czytania .xls
plików.
voyager wspomniał o zastosowaniu automatyzacji COM. Zrobiłem to kilka lat temu, ostrzegam, że robienie tego to prawdziwa PITA. Liczba zastrzeżeń jest ogromna, a dokumentacji brakuje i irytuje. Napotkałem wiele dziwnych błędów i pułapek, z których niektóre zajmowały wiele godzin.
AKTUALIZACJA: W przypadku nowszych .xlsx
plików zalecaną biblioteką do czytania i pisania wydaje się być openpyxl (dzięki, Ikar Pohorský).
.xlsx
) prawdopodobnie używałbyś OpenPyXL .
Korzystanie z pand:
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...
Możesz wybrać jedną z nich http://www.python-excel.org/
Poleciłbym bibliotekę python xlrd.
zainstaluj go za pomocą
pip install xlrd
import za pomocą
import xlrd
aby otworzyć skoroszyt
workbook = xlrd.open_workbook('your_file_name.xlsx')
otwórz arkusz według nazwy
worksheet = workbook.sheet_by_name('Name of the Sheet')
otwórz arkusz według indeksu
worksheet = workbook.sheet_by_index(0)
odczytaj wartość komórki
worksheet.cell(0, 0).value
Myślę, że Pandy to najlepsza droga. Jest już tutaj jedna odpowiedź z Pandami używającymi ExcelFile
funkcji, ale nie działała ona poprawnie dla mnie. Od tutaj znalazłem read_excel
funkcję, która działa dobrze:
import pandas as pd
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name")
print(dfs.head(10))
PS Musisz mieć xlrd
zainstalowany, aby read_excel
funkcja działała
Aktualizacja 21-03-2020: Jak widać tutaj , są problemy z xlrd
silnikiem i zostanie on wycofany. To openpyxl
najlepszy zamiennik. Tak więc, jak opisano tutaj , składnia kanoniczna powinna wyglądać następująco:
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name", engine="openpyxl")
W przypadku xlsx podoba mi się rozwiązanie opublikowane wcześniej jako https://web.archive.org/web/20180216070531//programming/4371163/reading-xlsx-files-using-python . Używam tylko modułów z biblioteki standardowej.
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
Dodane ulepszenia polegają na pobieraniu treści według nazwy arkusza, przy użyciu polecenia re do pobrania kolumny i sprawdzaniu, czy używane są wspólne ciągi znaków.
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
Możesz użyć dowolnej z wymienionych tutaj bibliotek (takich jak Pyxlreader, który jest oparty na JExcelApi lub xlwt ), a także automatyzacji COM, aby używać samego Excela do odczytu plików, ale w tym celu wprowadzasz Office jako zależność swojego oprogramowania, co nie zawsze jest opcją.
xlwt
pliki WriTes; używać xlrd
do plików ReaD.
Jeśli potrzebujesz starego formatu XLS. Poniżej kod dla 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 również obsługuje to zadanie. http://ghantoos.org/2007/10/25/python-pyexcelerator-small-howto/
Jest również dostępny w Debianie i Ubuntu:
sudo apt-get install python-excelerator
Możesz również rozważyć uruchomienie (innego niż Python) programu xls2csv. Podaj plik xls i powinieneś odzyskać plik csv.
xls2csv
, a następnie przeanalizowanie csv
z Pythona?
W przypadku starszych plików Excela istnieje moduł OleFileIO_PL, który może odczytać używany format pamięci masowej OLE.
with open(csv_filename) as file:
data = file.read()
with open(xl_file_name, 'w') as file:
file.write(data)
Możesz zmienić CSV, aby wyróżniać się jak powyżej, dzięki wbudowanym pakietom. CSV można obsłużyć za pomocą wbudowanego pakietu dictreader i dictwriter, który będzie działał w taki sam sposób, jak działa słownik Pythona. co sprawia, że jest to bardzo łatwe Obecnie nie znam żadnych wbudowanych pakietów dla programu Excel, ale natknąłem się na openpyxl. Było to również całkiem proste i proste. Możesz zobaczyć fragment kodu poniżej, mając nadzieję, że to pomoże
import openpyxl
book = openpyxl.load_workbook(filename)
sheet = book.active
result =sheet['AP2']
print(result.value)
W przypadku starszych .xls
plików możesz użyćxlrd
możesz użyć xlrd
bezpośrednio, importując go. Jak poniżej
import xlrd
wb = xlrd.open_workbook(file_name)
Możesz też użyć pd.read_excel()
metody pandy , ale nie zapomnij określić silnika, chociaż domyślnie jest xlrd
to ustawienie , należy go określić.
pd.read_excel(file_name, engine = xlrd)
Oba działają ze starszymi .xls
formatami plików. W rzeczywistości natknąłem się na to, kiedy korzystałem OpenPyXL
, otrzymałem poniższy błąd
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.