Gå til innhold

Anbefalte innlegg

Heysann, noen som kan hjelpe meg å splitt opp følgende til en dict? Infoen i stringen kan variere, men er alltid av samme format.

new debian package, version 2.0.
size 2644320 bytes: control archive= 1267 bytes.
    798 bytes,    18 lines      control
   1144 bytes,    17 lines      md5sums
Package: xnview
Version: 1.70-2
Section: alien
Priority: extra
Architecture: i386
Depends: libc6 (>= 2.3.4-1), libgcc1 (>= 1:4.0.1), libstdc++6 (>= 4.0.1), libx11-6, libxext6, libxp6, libxt6
Installed-Size: 5852
Maintainer: bjorn inge berg <[email protected]>
Description: XnView an easy graphics viewer / converter.
 XnView is a program for viewing and converting your graphics files.
 It supports more than 400 file formats (PNG, Jpeg, Targa, Alias, Softimage, Tdi, Gif,
 Unix bitmap, windows, Iff, Rgb, Sun raster, Fits, Photo CD, Photoshop and
 more).
 It offers the possiblity to apply filters (blur, average, emboss...) and
 effects (lens, waves, ...).
 Picture browser, Slide Show, Thumbnail create and RAW/YUV import.
 .
 (Converted from a rpm package by alien version 8.53.) 

 

Hittil har jeg kommet fram til denne koden, men jeg får bare éi linje av «Description». Lines er stringen.

       interests = ['Package', 'Version', 'Section', 'Description']
       info={}
       
       #if reload == False and not self.info:
        
        #   return self.info
       for get in interests:
           #print '--'.join([x for x in lines if get in lines])
           for data in lines:
               trimmed = data.strip()
               #print get == data[0:len(get)+1].strip(' ')
               #if data[0:len(get)+1] == get:
               #   print data
               stripped =data[0:len(get)+1].strip(' ')
               if get == stripped:
                   info[get] = data[len(get)+3:]

Lenke til kommentar
Videoannonse
Annonse

Noe slikt?

 

interests = ['Package', 'Version', 'Section', 'Description']
info={}

data = deb_data.split('\n')
for line in data:
   for i in interests:
       if line.startswith(i):
           key, val = line.split(':')
           info[key.strip()] = val.strip()

for k, v in info.items():
   print "%s -> %s" % (k, v)



Lenke til kommentar

Ja, det er jo det som er problemet. Teksten som blir spøtta ut nå er:

Section -> alien

Version -> 1.70-2

Description -> XnView an easy graphics viewer / converter.

Package -> xnview

Slik vil jeg altså ha det:

Section -> alien

Version -> 1.70-2

Description -> XnView an easy graphics viewer / converter.

XnView is a program for viewing and converting your graphics files.

It supports more than 400 file formats (PNG, Jpeg, Targa, Alias, Softimage, Tdi, Gif,

Unix bitmap, windows, Iff, Rgb, Sun raster, Fits, Photo CD, Photoshop and

more).

It offers the possiblity to apply filters (blur, average, emboss...) and

effects (lens, waves, ...).

Picture browser, Slide Show, Thumbnail create and RAW/YUV import.

.

(Converted from a rpm package by alien version 8.53.)

Package -> xnview

 

Lenke til kommentar

Med litt regexp går det fint:

def results(text,interests):
   d = {}
   for e in interests:
       p = r"%s:\s*(.*(?:\n\s.*)*)" % e
       m = re.compile(p).findall(text)
       d[e] = m[0]
   return d

text = ''.join(sys.stdin.readlines())
interests = ['Section','Package','Version','Description']
info = results(text,interests)
for k, v in info.items():
  print "%s -> %s" % (k,v)

 

Printer:

Section -> alien
Version -> 1.70-2
Description -> XnView an easy graphics viewer / converter.
XnView is a program for viewing and converting your graphics files.
It supports more than 400 file formats (PNG, Jpeg, Targa, Alias, Softimage, Tdi, Gif,
Unix bitmap, windows, Iff, Rgb, Sun raster, Fits, Photo CD, Photoshop and
more).
It offers the possiblity to apply filters (blur, average, emboss...) and
effects (lens, waves, ...).
Picture browser, Slide Show, Thumbnail create and RAW/YUV import.
.
(Converted from a rpm package by alien version 8.53.)
Package -> xnview

om du sender teksten din som input.

 

Edit: endret koden litt..

Endret av Psy
Lenke til kommentar

Tusen takk, funka jo flott dette. Men jeg får IndexError når jeg skifter interests til:

interests = ['Section','Package','Version', 'Depends', 'Installed-size', 'Description']

 

bjorninge@laptopBearUbuntu:~/Desktop$ ./Python\ Script.py

Traceback (most recent call last):

  File "./Python Script.py", line 39, in ?

    info = results(deb_data,interests)

  File "./Python Script.py", line 34, in results

    d[e] = m[0]

IndexError: list index out of range

Lenke til kommentar

Ikke spesielt pen kode, men ser ut til å funke.

 

interests = ['Package', 'Version', 'Section', 'Description']
info={}
data = deb_data.split('\n')
inside = False
flush = False
vals = []
length = len(data)

for ctr, line in enumerate(data):

   if ':' in line and inside:
       info[k] = "\n".join(vals)
       inside = False
   
   if ':' in line and not inside:
       k, v = line.strip().split(':', 1)
       
       if k.strip() in interests:
           inside = True
           interests.remove(k)
           vals = []
           vals.append(v.strip())
       else:
           del(k); del(v)

   elif length == ctr + 1: 
       flush = True
   
   elif inside:
       vals.append(line.strip())
   
   if flush:
       info[k] = "\n".join(vals)
       inside = False
       flush = False
       vals = []    

for k, v in info.items():
   print "%s -> %s" % (k, v)

Lenke til kommentar
Tusen takk, funka jo flott dette. Men jeg får IndexError når jeg skifter interests til:

interests = ['Section','Package','Version', 'Depends', 'Installed-size', 'Description']

 

bjorninge@laptopBearUbuntu:~/Desktop$ ./Python\ Script.py

Traceback (most recent call last):

  File "./Python Script.py", line 39, in ?

    info = results(deb_data,interests)

  File "./Python Script.py", line 34, in results

    d[e] = m[0]

IndexError: list index out of range

5144873[/snapback]

Det er case sensitivt, så Installed-size vil ikke fungere om teksten er Installed-Size som jeg tror den er.

Lenke til kommentar

Jepp, jeg fant ut av den indexerroren:)

Jeg får det enda ikke til; den statiske testen virker det på, men viss jeg kjører et dpkg query gjennom commands.getoutput (skal skifte til subprocess etterhvert dog), så vil ikke regexen virke (jeg er klar over at det er to forskjellige debs, men):

import re
import commands,sys
deb_data = """new debian package, version 2.0.
size 2644320 bytes: control archive= 1267 bytes.
   798 bytes,    18 lines      control
  1144 bytes,    17 lines      md5sums
Package: xnview
Version: 1.70-2
Section: alien
Priority: extra
Architecture: i386
Depends: libc6 (>= 2.3.4-1), libgcc1 (>= 1:4.0.1), libstdc++6 (>= 4.0.1), libx11-6, libxext6, libxp6, libxt6
Installed-Size: 5852
Maintainer: bjorn inge berg <[email protected]>
Description: XnView an easy graphics viewer / converter.
XnView is a program for viewing and converting your graphics files.
It supports more than 400 file formats (PNG, Jpeg, Targa, Alias, Softimage, Tdi, Gif,
Unix bitmap, windows, Iff, Rgb, Sun raster, Fits, Photo CD, Photoshop and
more).
It offers the possiblity to apply filters (blur, average, emboss...) and
effects (lens, waves, ...).
Picture browser, Slide Show, Thumbnail create and RAW/YUV import.
.

"""
deb_data2 = commands.getoutput('dpkg-deb -I /home/bjorninge/Desktop/downloads/alacarte_0.8-0ubuntu1_all.deb')

def results(text,interests):
  d = {}
  for e in interests:
      p = r"%s:\s*(.*(?:\n\s.*)*)" % e
      m = re.compile(p).findall(text)
      d[e] = m[0]
  return d


print repr(deb_data),'\n\n\n', repr(deb_data2)

 

dette gir da:

'new debian package, version 2.0.\nsize 2644320 bytes: control archive= 1267 bytes.\n    798 bytes,    18 lines      control\n  1144 bytes,    17 lines      md5sums\nPackage: xnview\nVersion: 1.70-2\nSection: alien\nPriority: extra\nArchitecture: i386\nDepends: libc6 (>= 2.3.4-1), libgcc1 (>= 1:4.0.1), libstdc++6 (>= 4.0.1), libx11-6, libxext6, libxp6, libxt6\nInstalled-Size: 5852\nMaintainer: bjorn inge berg <[email protected]>\nDescription: XnView an easy graphics viewer / converter.\n XnView is a program for viewing and converting your graphics files.\n It supports more than 400 file formats (PNG, Jpeg, Targa, Alias, Softimage, Tdi, Gif,\n Unix bitmap, windows, Iff, Rgb, Sun raster, Fits, Photo CD, Photoshop and\n more).\n It offers the possiblity to apply filters (blur, average, emboss...) and\n effects (lens, waves, ...).\n Picture browser, Slide Show, Thumbnail create and RAW/YUV import.\n .\n\n'

 

 

' new debian package, version 2.0.\n size 60800 bytes: control archive= 1513 bytes.\n    470 bytes,    14 lines      control              \n    1916 bytes,    24 lines      md5sums              \n    358 bytes,    12 lines  *  postinst  #!/bin/sh\n    164 bytes,    7 lines  *  prerm                #!/bin/sh\n Package: alacarte\n Version: 0.8-0ubuntu1\n Section: utils\n Priority: optional\n Architecture: all\n Conflicts: smeg (<< 0.8-0ubuntu1)\n Replaces: smeg\n Provides: smeg\n Installed-Size: 472\n Maintainer: Travis Watkins <[email protected]>\n Description: easy menu editing\n  Alacarte is an easy-to-use menu editor for GNOME that can add and edit new\n  entries and menus. It works with the freedesktop.org menu specification and\n  should work with any desktop environment that uses the spec.'

Lenke til kommentar

Prøv å endre deb_data2 slik:

 

deb_data2 = '\n'.join([k[1:] for k in deb_data2.split('\n'))

 

Kort sagt endrer dette deb_data2 slik at alle mellomrom på starten av hver linje blir fjernet.

 

Regexpen søker etter formatet:

<identifier>:<tekst>

og tar med alle etterfølgende linjer så lenge de starter på et mellomrom. Det blir derfor kluss om andre linjer også starter med mellomrom.

 

Edit: mulig du fjerner litt for mye da, men det er nå dette som er problemet. Endre på regexpen er nok den beste løsningen.

Endret av Psy
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...