Quelle version d'Excel? Si vous pouvez vous limiter à l'ouverture de fichiers Excel créés par Ecel 2007 ou 2010, vous devriez être en mesure d'analyser une grande partie ou la totalité du fichier au format XML.
Adam Crossland
Réponses:
97
Modifier:
dans la nouvelle version de pandas, vous pouvez passer le nom de la feuille en tant que paramètre.
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
cette solution obtient mon vote positif. avec openpyxl, je rencontre le problème suivant "InvalidFileException: openpyxl ne prend pas en charge l'ancien format de fichier .xls, veuillez utiliser xlrd pour lire ce fichier, ou le convertir au format de fichier .xlsx plus récent". D'autre part, pandas gère à la fois les fichiers .xls et .xlsx ... aussi, la lecture d'une table entière ne prend qu'une seule ligne de code.
nathanielng
3
Vous devrez installer des dépendances facultatives xlrdpour lire les fichiers Excel et xlwtpour écrire des fichiers Excel.
[Modifier] - d'après ce que je peux voir dans votre commentaire, quelque chose comme l'extrait ci-dessous pourrait faire l'affaire. Je suppose ici que vous recherchez simplement une colonne pour le mot «john», mais vous pouvez en ajouter plus ou en faire une fonction plus générique.
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)
Je pense que c'est peut-être ce que je veux qu'il fasse: from xlrd import open_workbook book = open_workbook ('simple.xls', on_demand = True) pour le nom dans book.sheet_names (): if name.endswith ('2'): sheet = book.sheet_by_name (nom) print sheet.cell_value (0,0) book.unload_sheet (name) large_files.py mais je ne veux pas qu'il utilise endwith je veux qu'il trouve et imprime les lignes qui contiennent un nom particulier ... comme Je veux qu'il imprime la ligne de l'énorme feuille Excel qui contient les données de John et non celles de Bob. Aidez-moi?
novak
Je vous suggère de poster ceci comme une question séparée et de mettre le code dans un bloc de code.
Jon Cage
C'est la deuxième question d'une série de questions connexes; dans la troisième question, il est révélé que le vrai fichier Excel est prétendument de 1,5 Go et la mémoire de l'ordinateur est décrite comme "pas assez" ... voir stackoverflow.com/questions/3241039/…
John Machin
16
Ce n'est pas aussi simple que d'ouvrir un fichier texte brut et nécessitera une sorte de module externe car rien n'est intégré pour le faire. Voici quelques options:
Si possible, vous pouvez envisager d'exporter la feuille de calcul Excel en tant que fichier CSV, puis d'utiliser le module csv python intégré pour la lire:
Ok, je ne comprends pas vraiment les trucs CSV, comment puis-je faire ouvrir mon fichier excel par python en tant que module csv? J'ai un programme qui fait ce que je veux pour les fichiers txt et je veux qu'il fasse la même chose pour ce fichier Excel ... quelle est la meilleure façon de procéder? Pouvez-vous élaborer là-dessus s'il vous plaît?
novak
Soit vous pouvez utiliser un module python tiers comme xlrd, soit enregistrer votre fichier Excel dans un fichier CSV, au lieu d'un fichier Excel normal. Je pense que le point qui vous manque, c'est qu'un fichier Excel n'a aucune ressemblance avec un fichier texte brut. Ouvrez le document Excel dans le bloc-notes et vous verrez ce que je veux dire. Vous devez soit enregistrer le fichier dans un format de texte brut tel que CSV (valeurs séparées par des virgules), qui est plus facile à lire avec python, soit installer et utiliser un module tiers qui peut analyser un fichier Excel pour vous.
Donald Miner
Le problème que j'ai, c'est que le fichier est vraiment très volumineux. Comment puis-je enregistrer le fichier au format CSV si je ne peux pas ouvrir complètement le fichier?
novak
@novak: Votre problème est que votre fichier fait 1,5 Go et que la mémoire de votre ordinateur n'est "pas assez" ...
>>> 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()
Cela crée un nœud qui prend une liste 2D (liste d'éléments de liste) et les pousse dans la feuille de calcul Excel. assurez-vous que les IN [] sont présents ou lancent une exception.
il s'agit d'une réécriture du nœud dynamo Revit excel pour excel 2013 alors que le nœud pré-emballé par défaut continuait à se rompre. J'ai également un nœud de lecture similaire. La syntaxe Excel en Python est délicate.
thnx @CodingNinja - mis à jour :)
###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")
Ce code a fonctionné pour moi avec Python 3.5.2. Il s'ouvre et enregistre et excelle. Je travaille actuellement sur la façon d'enregistrer des données dans le fichier, mais voici le code:
La question concerne la lecture d'un fichier Excel, pas un fichier texte séparé par des virgules. Les pandas semblent avoir une fonction pour cela ( pandas.read_excel).
Réponses:
Modifier:
dans la nouvelle version de pandas, vous pouvez passer le nom de la feuille en tant que paramètre.
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
Consultez la documentation pour des exemples sur la façon de passer
sheet_name
:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html
Ancienne version:
vous pouvez également utiliser le
pandas
package ....Lorsque vous travaillez avec un fichier Excel avec plusieurs feuilles, vous pouvez utiliser:
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()
imprimera les 5 premières lignes de votre fichier ExcelSi vous travaillez avec un fichier Excel avec une seule feuille, vous pouvez simplement utiliser:
import pandas as pd df = pd.read_excel(path + filename) print df.head()
la source
xlrd
pour lire les fichiers Excel etxlwt
pour écrire des fichiers Excel.Essayez la bibliothèque xlrd .
[Modifier] - d'après ce que je peux voir dans votre commentaire, quelque chose comme l'extrait ci-dessous pourrait faire l'affaire. Je suppose ici que vous recherchez simplement une colonne pour le mot «john», mais vous pouvez en ajouter plus ou en faire une fonction plus générique.
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)
la source
Ce n'est pas aussi simple que d'ouvrir un fichier texte brut et nécessitera une sorte de module externe car rien n'est intégré pour le faire. Voici quelques options:
http://www.python-excel.org/
Si possible, vous pouvez envisager d'exporter la feuille de calcul Excel en tant que fichier CSV, puis d'utiliser le module csv python intégré pour la lire:
http://docs.python.org/library/csv.html
la source
Il y a le package 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()
la source
Vous pouvez utiliser le package xlpython qui ne nécessite que xlrd. Trouvez-le ici https://pypi.python.org/pypi/xlpython et sa documentation ici https://github.com/morfat/xlpython
la source
Cela peut aider:
Cela crée un nœud qui prend une liste 2D (liste d'éléments de liste) et les pousse dans la feuille de calcul Excel. assurez-vous que les IN [] sont présents ou lancent une exception.
il s'agit d'une réécriture du nœud dynamo Revit excel pour excel 2013 alors que le nœud pré-emballé par défaut continuait à se rompre. J'ai également un nœud de lecture similaire. La syntaxe Excel en Python est délicate.
thnx @CodingNinja - mis à jour :)
###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")
la source
Ce code a fonctionné pour moi avec Python 3.5.2. Il s'ouvre et enregistre et excelle. Je travaille actuellement sur la façon d'enregistrer des données dans le fichier, mais voici le code:
import csv excel = csv.writer(open("file1.csv", "wb"))
la source
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)
Vous pouvez maintenant utiliser la puissance des pandas DataFrames!
la source
pandas.read_excel
).