2016-12-19 1 views
0

Les réponses aux questions du type « Comment puis-je faire « sans EOF (fichier) » »Python 3 passant par un fichier jusqu'à EOF. Fichier n'est pas seulement un ensemble de lignes similaires traitement besoin

ne couvrent pas tout à fait mon problème

Je un fichier avec un format comme

bloc d'en-tête

données

un autre bloc d'en-tête

plus de données (avec un nombre arbitraire de lignes de données dans chaque bloc de données)

...

Je ne sais pas combien de tête-ensembles de données il y a

J'ai lu avec succès le premier bloc, puis un ensemble de données utilisant des boucles qui recherchent la ligne vide à la fin du bloc de données.

Je ne peux pas simplement utiliser l'approche de type «pour chaque ligne dans un fichier ouvert» car j'ai besoin de lire les blocs de données d'en-tête un à la fois, puis de les traiter.

Comment puis-je détecter le dernier bloc de données d'en-tête.

Mon approche actuelle consiste à utiliser un essai sauf construction et attendre l'exception. Pas très élégant.

Répondre

1

Il est difficile de répondre sans voir votre code ...

Mais je suppose que vous lisez le fichier avec fp.read():

fp = open("a.txt") 
while True: 
    data = fp.read() 

Au lieu de cela:

  1. essayer pour transmettre toujours la longueur des données que vous avez détectées
  2. Vérifiez si le chunck lu est une chaîne vide, pas

Par exemple:

fp = open("a.txt") 
while True: 
    header = fp.read(headerSize) 
    if header is '': 
     # End of file 
     break 
    read_dataSize_from_header 
    data = fp.read(dataSize) 
    if data is '': 
     # Error reading file 
     raise FileError('Error reading file') 
    process_your_data(data) 
+0

En fin de compte j'ai fait une charge de changements regexp et il était facile de supprimer les lignes vides TIL et EOF repérer le début d'un bloc. – nerak99