Avatar billede mrgumble Nybegynder
22. oktober 2009 - 14:25 Der er 6 kommentarer og
1 løsning

Python 3.1: Udvid file-klassen (og noget med csv.DictWriter)

Hej!

Jeg bruger csv.DictWriter til at producere nogle CSV-filer. Desværre ser det ud til, at hver linje afsluttes med 2 linjeskift i stedet for blot én. (Nogle bud?)

Eftersom csv.DictWriter tager imod en "file" agtig objekt, tænkte jeg på at udvide file-klassen hvor jeg blot ændrer lidt i write-metoden. (Er det en decorator design?) Dvs. noget i retningen af følgende pseudo-kode:

[code]
class myFile (inherit file):
  def write(self, str):
    if str != '\n':
      super.write(str)
[/code]

Problemet er, at jeg ikke kan finde ud at nedarve funktionerne eller få fat i "file"-klassen.
Nogle bud?
Avatar billede j4k0b Nybegynder
22. oktober 2009 - 14:46 #1
Jeg har selv oplevet at csv.writer skriver dobbelte linjeskift. Kan desværre ikke lige huske årsagen.

Men du kan bruge StringIO.StringIO, som er et filelike-object:


from StringIO import StringIO

f = StringIO()
f.write('test')
f.seek(0)
print f.read()
Avatar billede j4k0b Nybegynder
22. oktober 2009 - 15:21 #2
from StringIO import StringIO

class myFile(StringIO):
    def write(self, string):
        if str != ''\n'':
            super(myFile, self).write(string)
Avatar billede arne_v Ekspert
22. oktober 2009 - 21:03 #3
Indeholder den sidste værdi i argumentet til writerow eventuelt et linieskift til sidst ?

Hvis ja, så var det nok bedre at fjerne det !
Avatar billede mrgumble Nybegynder
23. oktober 2009 - 09:52 #4
@arne_v:
Nej, er 100% sikker på der ikke er linjeskift i. Argumenterne er tekststrenge, som bliver indkapslet i gåseøjne, så det ville kunne ses.

@j4k0b:
Den prøver jeg. Havde ellers troet jeg selv skulle lave en __init__ metode.
Avatar billede mrgumble Nybegynder
23. oktober 2009 - 10:12 #5
Så fik jeg løst tingene, men ikke som forventet.
Løsningen fra j4k0b kunne jeg ikke anvende, da jeg ikke kunne finde ud af at starte objektet med et filnavn.

Jeg løste problemet ved at sætte Dialect.lineterminator til "\n" i stedet for "\r\n".
Alle der vil have point lægger svar. :)
Avatar billede mrgumble Nybegynder
12. oktober 2010 - 16:57 #6
Få point! Læg nogle svar!
Avatar billede arne_v Ekspert
12. oktober 2010 - 17:02 #7
ikke mig
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester