web-dev-qa-db-fra.com

Erreur: format non pris en charge ou fichier corrompu: enregistrement BOF attendu

J'essaie d'ouvrir un fichier xlsx et d'en imprimer le contenu. Je continue à rencontrer cette erreur:

import xlrd
book = xlrd.open_workbook("file.xlsx")
print "The number of worksheets is", book.nsheets
print "Worksheet name(s):", book.sheet_names()
print

sh = book.sheet_by_index(0)

print sh.name, sh.nrows, sh.ncols
print

print "Cell D30 is", sh.cell_value(rowx=29, colx=3)
print

for rx in range(5):
    print sh.row(rx)
    print

Il affiche cette erreur

raise XLRDError('Unsupported format, or corrupt file: ' + msg)
xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF record; found    '\xff\xfeT\x00i\x00m\x00'

Merci

16
user2353003

Le message d'erreur concerne l'enregistrement BOF (début de fichier) d'un fichier XLS. Cependant, l'exemple montre que vous essayez de lire un fichier XLSX.

Il y a 2 raisons possibles à cela:

  1. Votre version de xlrd est ancienne et ne prend pas en charge la lecture des fichiers xlsx.
  2. Le fichier XLSX est crypté et donc stocké au format OLE Compound Document, plutôt qu'au format Zip, le faisant apparaître xlrd comme un fichier XLS au format plus ancien.

Vérifiez que vous utilisez bien une version récente de xlrd. L'ouverture d'un nouveau fichier XLSX avec des données dans une seule cellule devrait le vérifier.

Cependant, je suppose que vous rencontrez la deuxième condition et que le fichier est crypté puisque vous déclarez ci-dessus que vous utilisez déjà xlrd version 0.9.2.

Les fichiers XLSX sont chiffrés si vous appliquez explicitement un mot de passe de classeur mais également si vous protégez par mot de passe certains éléments de la feuille de calcul. En tant que tel, il est possible d'avoir un fichier XLSX crypté même si vous n'avez pas besoin d'un mot de passe pour l'ouvrir.

pdate: Voir @ BStew's, troisième, plus probable, réponse, que le fichier est ouvert par Excel.

13
jmcnamara

Il y a aussi une troisième raison. Le cas où le fichier est déjà ouvert par Excel. Il génère la même erreur.

23
BStew

Et peut-être la quatrième raison, vous avez utilisé read_Excel pour lire un fichier csv. (Ce n'est pas ce qui m'est arrivé ...)

21
Mike Chan

Vous pouvez obtenir cette erreur lorsque le fichier xlsx est en fait html; vous pouvez l'ouvrir avec un éditeur de texte pour le vérifier. Quand j'ai eu cette erreur, je l'ai résolue en utilisant des pandas:

import pandas as pd
df_list = pd.read_html('filename.xlsx')
df = pd.DataFrame(df_list[0])
5
Pluto

Dans mon cas, le problème était lié au dossier partagé lui-même.

CASE IN POINT: J'ai un dossier partagé sur le serveur WIN2012 où l'utilisateur dépose le fichier .xlsx puis utilise mon script python pour charger ce fichier xlsx dans une table de base de données.

Même si l'utilisateur a supprimé l'ancien fichier et a mis le fichier à charger, l'erreur BOF a continué à mentionner une chaîne d'octets et le nom de l'utilisateur dans la chaîne d'octets - nulle part à l'intérieur du fichier xlsx dans n'importe quelle feuille de calcul y avait-il le nom de l'utilisateur. De plus, lorsque j'ai copié le .xlsx dans un dossier nouvellement créé et exécuté le script référençant ce nouveau dossier, cela a fonctionné.

Donc, à la fin, j'ai supprimé le dossier partagé et j'ai réalisé que 5 éléments avaient été supprimés même si un seul élément était visible pour moi et l'utilisateur. Je pense que c'est dû à mon manque de compétences en administration Windows, mais c'était le coupable.

0
Ali Khan

J'ai reçu le même message d'erreur. Cela me semble tellement bizarre car le script fonctionne pour les fichiers xlsx sous un autre dossier et les fichiers sont presque les mêmes.

Je ne sais toujours pas pourquoi cela s'est produit. Mais finalement, j'ai copié tous les fichiers Excel dans un autre dossier et le script a fonctionné. Une option à essayer si aucune des suggestions ci-dessus ne vous convient ...

0
jxshen