[Python] Inlezen bestand met speciale karakters

Pagina: 1
Acties:
  • 369 views sinds 30-01-2008
  • Reageer

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Ik heb een probleem met bepaalde XML bestanden. Deze willen nl. niet parsen omdat er speciale karakters in staan. Nu is dit op te lossen door de documenten te openen met textpad en ze dan op te slaan als Unicode.

Hoewel dit een werkende oplossing is zou ik dit graag willen automatiseren. Eerste optie is om dit met Python te doen maar daar lukt het me niet om de bronbestanden in te lezen omdat Python ook struikelt over die speciale tekens. Tweede optie is om met Java aan de gang te gaan, alleen weet ik niet waar ik zou moeten beginnen en of ik dan ook niet tegen dezelfde 'import' problemen aan loop.

Basically zoek ik dus een manier om dergelijke bestanden in te kunnen lezen zoals Notepad dat doet. Het liefst met Python.

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

[google=python open unicode files] :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Mijn probleem is dat het document niet in Unicode is gencodeerd maar wel de speciale karakters bevat... Maar ik zal nog eens op die pagina kijken!

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • ari3
  • Registratie: Augustus 2002
  • Niet online
Mischien kun je toelichten wat je onder "speciale karakters" verstaat?

Als je zgn. control karakters bedoeld (zoals ^B of ^H) dan moet je weten dat deze niet toegestaan zijn in XML met uitzondering van tab, LF, CR en spatie.

Als je zichtbare tekens bedoeld dan is het zaak uit te zoeken welke encoding gebruikt wordt en deze kenbaar te maken aan de XML parser.

"Kill one man, and you are a murderer. Kill millions of men, and you are a conqueror. Kill them all, and you are a god." -- Jean Rostand


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Misschien kan je ook even de fout geven die Python naar je hoofd slingert?

Rustacean


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Ok, dit is het bestand dat ik inlees, opgeslagen in notepad in ANSI condering:
code:
1
2
3
4
<?xml version="1.0" standalone="yes"?>
<root>
    <book>Weird characters! €&#8218;</book>
</root>

De drie rare characters (€‚) zijn alle drie Unicode tekens (0128, 0129 en 0130). Om te controleren of het bestand doet wat het moet doen moet je hem openen in IE. Deze zou een parse error moeten geven.
Dit is mijn programma:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import fileinput
import re
import os
import os.path
import string
import time
import sys
import xml.dom.minidom
import codecs
from xml.dom.minidom import parse, parseString

# determine file paths
InputFile = "C:\\TEMP\\TEST.xml"

infile = codecs.open(InputFile)
text = infile.read()

#Parse in XML data file and get SalesOrderID value
#dom = parse(text) 
#book = dom.getElementsByTagName("book")[0]
#dom.unlink()

# create output file
OutputFP = codecs.open("C:\\TEMP\\out.xml", "w", "UTF-16")
OutputFP.write(text)
InputFile.close()
OutputFP.close()

En daarmee krijg ik de volgende error:
code:
1
2
3
4
5
6
7
8
Traceback (most recent call last):
  File "C:\temp\XMLconvert.py", line 25, in ?
    OutputFP.write(text)
  File "C:\Python21\lib\codecs.py", line 340, in write
    return self.writer.write(data)
  File "C:\Python21\lib\codecs.py", line 137, in write
    data, consumed = self.encode(object,self.errors)
UnicodeError: UTF-8 decoding error: unexpected code byte

Het vreemde is dat ik dit na een tijdje weer heb opgepakt en nu lijkt het inlezen wel goed te gaan maar het wegschrijven is nu een probleem...

BTW, ik ben totaal niet bekend met Python en werk normaal in Java.

[ Voor 21% gewijzigd door Deddiekoel op 21-07-2005 19:20 ]

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Ik heb nu nog van alles meer geprobeert (zoals het schrijven van een BOM, maar dan wordt alles onleesbaar). Maar zodra ik de input wil veranderen richting Unicode gaat het mis. UTF-8 wil niet werken en UTF-16 is onleesbaar...

Oh, het gaat trouwens om Python 2.1

[ Voor 29% gewijzigd door Deddiekoel op 21-07-2005 14:03 ]

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:59

alienfruit

the alien you never expected

Tja, je hebt UTF8 met en zonder BOM, verder is "normale" tekst allene de standaard 127 ASCII karakters. Je dus in principe kunnen kijken of er alleen maar die 127 tekens voorkomen. Zo ja, dan ASCII anders heb je te maken met een andere karakter set bijv. unicode. Gelukkig is UTF-8 e.d. compatible met ASCII. Daarom gebruik in bijna al mijn projecten intern gewoon UTF-8, om van het meeste gezeik af te zijn.

Overigens hoe gaat Python om met xml bestanden, wat is de standaard karakterset die hij gebruikt? In je xml voorbeeld geef je namelijk geen encoding-attribute mee. Soms kan dat nog wel eens helpen, verder kan je je bronbestand ook niet open met UTF-8 alvast?

Python:
1
2
infile = codecs.open( inputFile, "r", "utf-8" )
#dom = parse( text.encode( 'utf-8' ) ) // geen idee of dit werkt

[ Voor 40% gewijzigd door alienfruit op 21-07-2005 14:18 ]


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Als ik bij open al "utf-8" specificeer dan krijg ik dezelfde error. Hetzelfde als ik encode("utf-8") gebruik!
Elke keer als de input naar UTF-8 moet gaat het mis. UTF-16 gaat beter maar dan kan ik het allemaal niet meer uitlezen...

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Ik ben er inmiddels achter hoe het kan. Het is simpelweg zaak de precieze encoding te weten in het geval van windows is dit cp1252. Met de volgende code maak je van een ANSI (windows standaard) een UTF8 bestand:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import string
import codecs
import sys

InputFile = sys.argv[1]

#Convert file to UTF-8 to allow XML parsing

#Read file using correct encoding ('cp1252' = windows standard)
infile = codecs.open(InputFile, 'r', 'cp1252')
text = infile.read()
infile.close()

#Output data to file using standard XML encoding UTF-8
outputFP = codecs.open(InputFile, 'w', 'UTF-8')
outputFP.write(text)
outputFP.close

Dit werkt prima, maar ik ben nog niet helemaal tevreden. Stel dat ik nu wel een UTF-8 bestand hier in voer dan gaat het alsnog mis. Aangezien ik vrij onbekend ben met Python vraag ik me af of er een manier is om een error op de conversie (eigenlijk bij het inlezen) af te vangen en dan te negeren?

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2

Pagina: 1