Domanda

Sto cercando di formattare un file in modo che possa essere inserito in un database, il file viene inizialmente compresso e arround grande 1.3MB. Ogni linea simile a questa:

  

398,% 7EAnoniem + 001% 7E, 543,480,7525010,1775,0

In questo modo il codice sembra che analizza questo file:

   Village = gzip.open(Root+'\\data'+'\\' +str(Newest_Date[0])+'\\' +str(Newest_Date[1])+'\\' +str(Newest_Date[2])\
               +'\\'+str(Newest_Date[3])+' village.gz');
Village_Parsed = str
for line in Village:
    Village_Parsed = Village_Parsed + urllib.parse.unquote_plus(line);
print(Village.readline());

Quando eseguo il programma ottengo questo errore:

Village_Parsed = Village_Parsed + urllib.parse.unquote_plus(line);
     

file "C: \ Python31 \ lib \ urllib \ parse.py", la linea 404, in unquote_plus      stringa = String.Replace ( '+', ' ')   TypeError: atteso un oggetto con l'interfaccia tampone

Qualche idea su ciò che è sbagliato? Grazie in anticipo per qualsiasi aiuto:)

È stato utile?

Soluzione

import gzip, os, urllib.parse

archive_relpath = os.sep.join(map(str, Newest_Date[:4])) + ' village.gz'  
archive_path = os.path.join(Root, 'data', archive_relpath)

with gzip.open(archive_path) as Village:
    Village_Parsed = ''.join(urllib.parse.unquote_plus(line.decode('ascii'))
                             for line in Village)
    print(Village_Parsed)

Output:

398,~Anoniem 001~,543,480,7525010,1775,0

NOTA: RFC 3986 - Uniform Resource Identifier (URI): Sintassi Generico dice:

  

Questa specificazione non mandato   qualsiasi codifica particolare carattere   per la mappatura tra i caratteri e URI   gli ottetti utilizzati per memorizzare o   trasmettere quei personaggi. Quando un URI   appare in un elemento di protocollo, la   codifica dei caratteri è definito da tale   protocollo; senza tale   definizione, un URI si presume essere in   la stessa codifica dei caratteri come   testo circostante.

Pertanto 'ascii' nel frammento line.decode('ascii') dovrebbe essere sostituito con qualsiasi codifica dei caratteri che hai utilizzato per codificare il testo.

Altri suggerimenti

PROBLEMA 1 è che urllib.unquote_plus non piace il line che avete nutrito. Il messaggio deve essere "Si prega di fornire un oggetto str" :-) Vi suggerisco di risolvere il problema 2 qui sotto, ed inserto:

print('line', type(line), repr(line))

immediatamente dopo la sua dichiarazione for in modo che si può vedere che cosa hai trovato in line.

Troverete che restituisce i byte oggetti:

>>> [line for line in gzip.open('test.gz')]
[b'nudge nudge\n', b'wink wink\n']

Utilizzando una modalità di 'r' ha un effetto scarso:

>>> [line for line in gzip.open('test.gz', 'r')]
[b'nudge nudge\n', b'wink wink\n']

Io suggerisco che invece di passare line alla routine di analisi si passa line.decode('UTF-8') ... o qualsiasi altra cosa la codifica è stato utilizzato quando il file gz è stato scritto.

PROBLEMA 2 è in questa linea:

Village_Parsed = str

str è un tipo. Avete bisogno di un oggetto str vuota. Per ottenere questo, si potrebbe chiamare il tipo cioè str() che è formalmente corretto ma poco pratico / inusuali / scoffable / strano quando rispetto all'utilizzo di una costante stringa '' ... quindi fare questo:

Village_Parsed = ''

Hai anche PROBLEMA 3: la tua ultima affermazione sta cercando di leggere il file gz dopo EOF

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top