2016-05-13 14 views
0

Ich habe eine Datei, die eine Anzahl von Headern von Binärdaten hat (ich nehme an, das ist was es ist) und danach gibt es Textzeilen. Ich fange gerade an, damit zu arbeiten, aber ich bemerkte, dass, wenn ich die Python "Aufzählung" -Funktion verwende, es nicht erscheint, um die Linien zu lesen, die ich es lesen möchte (ich benutze Python 2.7.8). Es gibt nicht die Zeilen zurück, an denen ich interessiert bin. In meinem Texteditor kann ich die Daten sehen, die ich will, aber das Ergebnis zeigt an, dass es vielleicht "serialisierte Daten" sind? Am Ende der Datei befindet sich mehr von der gleichen Binärdatei.Wie kann ich Binärdatenheader ignorieren (oder nur die serialisierten Daten lesen), wenn ich eine Datei mit Python aufzähle?

Probe von Data File (ich hoffe, dass die ersten 8 Zeilen überspringen): ich mit der Linie beginnen soll, die mit „Kurve“ beginnt.

ÿÿÿÿ   ENetDeedPlotter, Version=5.6.1.0, Culture=neutral, PublicKeyToken=null QSystem.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a Net_Deed_Plotter.SerializeData! LinesOfDataNumberOfTractsSeditortextSedLineStract 
SNoteArraySNorthArrow 
Slandscape 
SPaperSizeSPaperBounds 
SPrinterScaleSPrinterScaleStrSAllTractsMouseOffsetNSAllTractsMouseOffsetESAllTractsNOffsetSAllTractsEOffsetSImageScroll_YSImageScroll_XSImage_YSImage_XSImageFilePath 
SUpDateMapSttcSttStbSboSnb 
STitleText SDateText SPOBLines 
SLabelCornersSNAmountTract0HasBeenMovedSEAmountTract0HasBeenMoved      Net_Deed_Plotter.LineData[] Net_Deed_Plotter.TractData[] System.Collections.ArrayList+Net_Deed_Plotter.PaperForm+NorthArrowStruct !System.Drawing.Printing.PaperSize System.Drawing.Rectangle  '   Ân40.4635w 191.02 
curve right radius 953.50 arc 361.84 chord n60.5705e 359.07 
s56.3005e 3.81 
s19.4515w 170.63 
s13.4145w 60.67 
s51.0250w 155.35 
n40.4635w 191.02 
curve left radius 615.16 arc 202.85 chord s45.19w 201.94 

Beispielskript

# INPUTS TO BE UPDATED 
inputNDP = r"N:\Parcels\Parcels2012\57-11-115.ndp" 
outputTXT = r"N:\Parcels\Parcels2012\57-11-115.txt" 
# END OF INPUTS TO BE UPDATED 
fileNDP = open(inputNDP, 'r') 
for line in enumerate(9, fileNDP): 
    print line 

Ergebnis

(9, '\x00\x01\x00\x00\x00\xff\xff\xff\xff\x01\x00\x00\x00\x00\x00\x00\x00\x0c\x02\x00\x00\x00ENetDeedPlotter, Version=5.6.1.0, Culture=neutral, PublicKeyToken=null\x0c\x03\x00\x00\x00QSystem.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\x05\x01\x00\x00\x00\x1eNet_Deed_Plotter.SerializeData!\x00\x00\x00\x0bLinesOfData\x0eNumberOfTracts\x0bSeditortext\x07SedLine\x06Stract\n') 
(10, 'SNoteArray\x0bSNorthArrow\n') 
(11, 'Slandscape\n') 
(12, 'SPaperSize\x0cSPaperBounds\rSPrinterScale\x10SPrinterScaleStr\x16SAllTractsMouseOffsetN\x16SAllTractsMouseOffsetE\x11SAllTractsNOffset\x11SAllTractsEOffset\x0eSImageScroll_Y\x0eSImageScroll_X\x08SImage_Y\x08SImage_X\x0eSImageFilePath\n') 
(13, 'SUpDateMap\x04Sttc\x03Stt\x03Stb\x03Sbo\x03Snb\n') 
(14, 'STitleText\tSDateText\tSPOBLines\rSLabelCorners') 
>>> 

Antwort

0

ich herausgefunden, da die Datei in ein binäres Format war, habe ich es mit offenem auf diese Weise zu lesen benötigt ('myfile', 'rb') anstatt mit open ('myfile', 'r') und ich habe eine Menge Hilfe von this question bekommen.

Die Re-write sieht wie folgt aus ...

#ToDO write output file 
# INPUTS TO BE UPDATED 
inputNDP = r"N:\Parcels\Parcels2012\57-11-115.ndp" 
# END OF INPUTS TO BE UPDATED 
fileNDP = open(inputNDP, 'rb') 
def strip_nonascii(b): 
    return b.decode('ascii', errors='ignore') 

n = 0 
for line in fileNDP: 
    if n > 5: 
     if '|' in line: 
      break 
     print(strip_nonascii(line)).strip('\n') # + str(n) 
    n += 1 
1

Beachten Sie, dass enumerate einen start Parameter annimmt, die nur den Anfangswert der Zahl setzt. Es bewirkt nicht, dass Inhalte übersprungen werden.

Wenn Sie Zeilen überspringen möchten, müssen Sie Ihre Aufzählung filtern:

x=xrange(20) 
>>> for num,text in (tpl for tpl in enumerate(x) if tpl[0] >8): 
... print num,text 
... 
9 9 
10 10 
11 11 
12 12 
13 13 
14 14 
15 15 
16 16 
17 17 
18 18 
19 19 
+0

ja - ich war falsch interpretiert den Startparameter. Aber selbst wenn ich keinen Startparameter einschließe, gibt es die gleichen Daten zurück (nur ohne die Anzahl). Es gibt nur 5 Zeilen zurück, aber der Texteditor zeigt 54 Zeilen. – jbchurchill