Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

fileinput

4 réponses
Avatar
lacsaP Patatetom
bonjour,

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

-----------------------

import fileinput
import sys
try:
source =3D sys.argv[1:]
except IndexError:
source =3D 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=C3=A9passer l'erreur mais cette fois,=
le script r=C3=A9agit diff=C3=A9remment selon l'entr=C3=A9e utilis=C3=A9e =
:

-----------------------

import fileinput
import sys
try:
source =3D sys.argv[1:]
except IndexError:
source =3D None
for line in fileinput.input(source, openhook=3Dfileinput.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 ?

4 réponses

Avatar
Jo Engo
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 -+-
Avatar
Jo Engo
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 -+-
Avatar
lacsaP Patatetom
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...
Avatar
lacsaP Patatetom
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())