fileinput

Le
lacsaP Patatetom
bonjour,

j'ai un petit script python censé ouvrir un fichier journal et affiche=
r son contenu mais comme vous le voyez, une erreur liée à l'encod=
age survient :

--

import fileinput
import sys
try:
source = sys.argv[1:]
except IndexError:
source = None
for line in fileinput.input(source):
print(line.strip())

--

python3.7.4 myscript.py myfile.log
Traceback (most recent call last):

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 in position 799: i=
nvalid continuation byte

python3.7.4 myscript.py < myfile.log
Traceback (most recent call last):

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 in position 799: i=
nvalid continuation byte

--

j'ajoute le crochet d'encodage pour dépasser l'erreur mais cette fois,=
le script réagit différemment selon l'entrée utilisée =
:

--

import fileinput
import sys
try:
source = sys.argv[1:]
except IndexError:
source = None
for line in fileinput.input(source, openhook=fileinput.hook_encoded("utf-=
8", "ignore")):
print(line.strip())

--

python3.7.4 myscript.py myfile.log
first line of myfile.log

last line of myfile.log

python3.7.4 myscript.py < myfile.log
Traceback (most recent call last):

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 in position 799: i=
nvalid continuation byte

python3.7.4 myscript.py /dev/stdin < myfile.log
first line of myfile.log

last line of myfile.log

python3.7.4 myscript.py - < myfile.log
Traceback (most recent call last):

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 in position 799: i=
nvalid continuation byte

--

quelqu'un aurait-il une explication et/ou une solution ?
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jo Engo
Le #26529585
Le Fri, 25 Oct 2019 13:04:57 -0700, lacsaP Patatetom a écrit :
python3.7.4 myscript.py myfile.log Traceback (most recent call last):
...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 in position
799: invalid continuation byte


Tu as un caractère non-UTF8 dans le fichier que tu parse (à la position
799 et il s'agit du caractère 0xE8
--
Qu'est-ce qu'un adulte ? Un enfant gonflé d'âge.
-+- Simone de Beauvoir -+-
Jo Engo
Le #26529651
Le Sat, 26 Oct 2019 08:15:34 -0700, lacsaP Patatetom a écrit :
celui-ci fonctionne lorsque le fichier journal est passé en paramètre,
mais pas lorsqu'il passé sur l'entrée standard...


Oui j'ai vu, mes excuse donc. Au risque de répondre encore à côté de la
plaque, 1 question et 1 suggestion qui n'a rien à voir avec la question
Question : où dans le fichier se situe le byte erroné ? (au milieu ou à
la fin ?) si c'est à la fin ça peut expliquer la différence de taritement
Suggestion
Comme tu semble attendre de tels problèmes pourquoi ne traites-tu pas le
fichier en raw (en 8 bits, sans tenir compte d'*aucun* caractères utf8)
--
Le trop de promptitude à l'erreur nous expose.
-+- Pierre Corneille -+-
lacsaP Patatetom
Le #26529658
Le dimanche 27 octobre 2019 08:40:28 UTC+1, Jo Engo a écrit :
Le Sat, 26 Oct 2019 08:15:34 -0700, lacsaP Patatetom a écrit :
celui-ci fonctionne lorsque le fichier journal est passé en param ètre,
mais pas lorsqu'il passé sur l'entrée standard...

Oui j'ai vu, mes excuse donc. Au risque de répondre encore à c ôté de la
plaque, 1 question et 1 suggestion qui n'a rien à voir avec la quest ion
Question : où dans le fichier se situe le byte erroné ? (au mil ieu ou à
la fin ?) si c'est à la fin ça peut expliquer la différenc e de taritement
Suggestion
Comme tu semble attendre de tels problèmes pourquoi ne traites-tu pa s le
fichier en raw (en 8 bits, sans tenir compte d'*aucun* caractères ut f8)
--
Le trop de promptitude à l'erreur nous expose.
-+- Pierre Corneille -+-

il semblerait que le problème soit connu : https://bugs.python.org/iss ue26756
si sys.stdin est utilisé par fileinput alors le hook n'est pas appliqu é, ce qui explique la différence de comportement...
lacsaP Patatetom
Le #26529657
Le dimanche 27 octobre 2019 09:04:41 UTC+1, lacsaP Patatetom a écrit  :
Le dimanche 27 octobre 2019 08:40:28 UTC+1, Jo Engo a écrit :
Le Sat, 26 Oct 2019 08:15:34 -0700, lacsaP Patatetom a écrit  :
> celui-ci fonctionne lorsque le fichier journal est passé en para mètre,
> mais pas lorsqu'il passé sur l'entrée standard...
Oui j'ai vu, mes excuse donc. Au risque de répondre encore à côté de la
plaque, 1 question et 1 suggestion qui n'a rien à voir avec la que stion
Question : où dans le fichier se situe le byte erroné ? (au m ilieu ou à
la fin ?) si c'est à la fin ça peut expliquer la différe nce de taritement
Suggestion
Comme tu semble attendre de tels problèmes pourquoi ne traites-tu pas le
fichier en raw (en 8 bits, sans tenir compte d'*aucun* caractères utf8)
--
Le trop de promptitude à l'erreur nous expose.
-+- Pierre Corneille -+-

il semblerait que le problème soit connu : https://bugs.python.org/i ssue26756
si sys.stdin est utilisé par fileinput alors le hook n'est pas appli qué, ce qui explique la différence de comportement...

le script ci-dessous fonctionne dans tous les cas :
import io
import fileinput
import sys
try:
source = sys.argv[1:]
except IndexError:
source = None
sys.stdin = io.TextIOWrapper(sys.stdin.buffer, errors='ignore')
for line in fileinput.input(source, openhook=fileinput.hook_encoded('utf- 8', 'ignore')):
print(line.strip())
Publicité
Poster une réponse
Anonyme