Какая версия Excel? Если вы можете ограничиться открытием файлов Excel, созданных Ecel 2007 или 2010, вы сможете анализировать большую часть или весь файл как XML.
Adam Crossland,
Ответы:
97
Изменить:
в более новой версии pandas вы можете передать имя листа в качестве параметра.
file_name = # path to file + file name
sheet = # sheet name or sheet number or list of sheet numbers and namesimport pandas as pd
df = pd.read_excel(io=file_name, sheet_name=sheet)
print(df.head(5)) # print first 5 rows of the dataframe
это решение получает мою поддержку. с openpyxl у меня возникает следующая проблема: «InvalidFileException: openpyxl не поддерживает старый формат файла .xls, пожалуйста, используйте xlrd для чтения этого файла или конвертируйте его в более свежий формат файла .xlsx». С другой стороны, pandas обрабатывает файлы .xls и .xlsx ... кроме того, чтение всей таблицы занимает всего одну строку кода.
nathanielng
3
Вам потребуется установить дополнительные зависимости xlrdдля чтения файлов Excel и xlwtдля записи файлов Excel.
[Edit] - из того, что я вижу из вашего комментария, что-то вроде приведенного ниже фрагмента может помочь. Я предполагаю, что вы просто ищете в одном столбце слово «john», но вы можете добавить больше или превратить его в более общую функцию.
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 = -1for cell in sheet.col(0): # if'john'in cell.value:
break# If we found the row, print itif row != -1:
cells = sheet.row(row)
for cell in cells:
print cell.value
book.unload_sheet(name)
Я думаю, что это может быть то, что я хочу сделать: from xlrd import open_workbook book = open_workbook ('simple.xls', on_demand = True) для имени в 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, но я не хочу, чтобы он использовал конец, я хочу, чтобы он находил и печатал строки, содержащие конкретное имя ... например Я хочу, чтобы он напечатал строку огромного листа Excel, который содержит данные Джона, а не Боба. Помогите?
novak
Я предлагаю вам опубликовать это как отдельный вопрос и поместить код в блок кода.
Джон Кейдж,
Это второй вопрос из серии связанных вопросов; в третьем вопросе выясняется, что реальный файл excel предположительно составляет 1,5 ГБ, а память компьютера описывается как «недостаточно» ... см. stackoverflow.com/questions/3241039/…
Джон Мачин
16
Это не так просто, как открытие простого текстового файла, и для этого потребуется какой-то внешний модуль, поскольку для этого ничего не встроено. Вот несколько вариантов:
Если возможно, вы можете рассмотреть возможность экспорта электронной таблицы Excel в виде файла CSV, а затем использовать встроенный модуль csv python для ее чтения:
Хорошо, я действительно не понимаю материал CSV, как мне сделать так, чтобы python открыл мой файл Excel как модуль csv? У меня есть программа, которая делает то, что я хочу для файлов txt, и я хочу, чтобы она делала то же самое для этого файла excel ... что лучше всего? Не могли бы вы подробнее рассказать об этом?
novak
Либо вы можете использовать сторонний модуль python, например xlrd, либо сохранить файл Excel в виде CSV-файла вместо обычного файла Excel. Я думаю, что вам не хватает того, что файл Excel не похож на обычный текстовый файл. Откройте документ Excel в блокноте, и вы поймете, что я имею в виду. Вам нужно либо сохранить файл в текстовом формате, таком как CSV (значения, разделенные запятыми), который легче читать с помощью python, либо установить и использовать сторонний модуль, который может анализировать файл Excel за вас.
Дональд Майнер,
Проблема в том, что файл действительно очень большой. Как мне сохранить файл в формате CSV, если я не могу полностью открыть файл?
novak
@novak: Ваша проблема в том, что размер вашего файла 1,5 ГБ, а памяти вашего компьютера «недостаточно» ...
>>> 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()
Это создает узел, который принимает 2D-список (список элементов списка) и помещает их в электронную таблицу Excel. убедитесь, что IN [] присутствуют или вызовут исключение.
это переписывание динамо-узла Revit Excel для Excel 2013, поскольку предварительно упакованный узел по умолчанию постоянно ломался. У меня тоже есть похожий узел чтения. Синтаксис Excel в Python обидчив.
thnx @CodingNinja - обновлено :)
###Export Excel - intended to replace malfunctioning excel nodeimport 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=0if IN[2]>0:
RowOffset=IN[2] ##RowOffset
ColOffset=0if IN[3]>0:
ColOffset=IN[3] ##COL OFfsetif 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### ALertsimport 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 Exceltry:
ws = wb.Worksheets(sheetName) ####Get the sheet in the WB baseexcept:
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 errorfor 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")
Этот код работал у меня с Python 3.5.2. Он открывается, сохраняет и преуспевает. В настоящее время я работаю над тем, как сохранить данные в файл, но это код:
Ответы:
Изменить:
в более новой версии pandas вы можете передать имя листа в качестве параметра.
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
Посмотрите в документации примеры того, как пройти
sheet_name
:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html
Старая версия:
вы также можете использовать
pandas
пакет ....Когда вы работаете с файлом Excel с несколькими листами, вы можете использовать:
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()
напечатает первые 5 строк вашего файла ExcelЕсли вы работаете с файлом Excel с одним листом, вы можете просто использовать:
import pandas as pd df = pd.read_excel(path + filename) print df.head()
источник
xlrd
для чтения файлов Excel иxlwt
для записи файлов Excel.Попробуйте библиотеку xlrd .
[Edit] - из того, что я вижу из вашего комментария, что-то вроде приведенного ниже фрагмента может помочь. Я предполагаю, что вы просто ищете в одном столбце слово «john», но вы можете добавить больше или превратить его в более общую функцию.
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)
источник
Это не так просто, как открытие простого текстового файла, и для этого потребуется какой-то внешний модуль, поскольку для этого ничего не встроено. Вот несколько вариантов:
http://www.python-excel.org/
Если возможно, вы можете рассмотреть возможность экспорта электронной таблицы Excel в виде файла CSV, а затем использовать встроенный модуль csv python для ее чтения:
http://docs.python.org/library/csv.html
источник
Есть пакет 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()
источник
Вы можете использовать пакет xlpython, для которого требуется только xlrd. Найдите его здесь https://pypi.python.org/pypi/xlpython и его документацию здесь https://github.com/morfat/xlpython
источник
Это может помочь:
Это создает узел, который принимает 2D-список (список элементов списка) и помещает их в электронную таблицу Excel. убедитесь, что IN [] присутствуют или вызовут исключение.
это переписывание динамо-узла Revit Excel для Excel 2013, поскольку предварительно упакованный узел по умолчанию постоянно ломался. У меня тоже есть похожий узел чтения. Синтаксис Excel в Python обидчив.
thnx @CodingNinja - обновлено :)
###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")
источник
Этот код работал у меня с Python 3.5.2. Он открывается, сохраняет и преуспевает. В настоящее время я работаю над тем, как сохранить данные в файл, но это код:
import csv excel = csv.writer(open("file1.csv", "wb"))
источник
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)
Теперь вы можете использовать возможности pandas DataFrames!
источник
pandas.read_excel
).