2017-01-28 3 views
2

Mein Code unten überprüft die Gültigkeit von Postleitzahlen mit einem regulären Ausdruck. Die Postleitzahlen werden in Form eines Arrays vergeben. Die for-Schleife überprüft die Gültigkeit jeder Postleitzahl mit dem gegebenen regulären Ausdruck. Jetzt möchte ich alle gültigen Postleitzahlen in eine CSV-Datei schreiben. Unten ist mein Code:Schreiben Sie Daten in Csv-Datei in Python

import csv 
import re 

regex = r"(GIR\s0AA)|((([A-PR-UWYZ][0-9][0-9]?)|(([A-PR-UWYZ][A-HK-Y][0-9]((BR|FY|HA|HD|HG|HR|HS|HX|JE|LD|SM|SR|WC|WN|ZE)[0-9])[0-9])|([A-PR-UWYZ][A-HK-Y](AB|LL|SO)[0-9])|(WC[0-9][A-Z])|(([A-PR-UWYZ][0-9][A-HJKPSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))))\s[0-9][ABD-HJLNP-UW-Z]{2})" 

postcodes = ['$%±()()','XX XXX','A1 9A','LS44PL','Q1A 9AA','V1A 9AA','X1A 9BB','LI10 3QP','LJ10 3QP','LZ10 3QP','A9Q 9AA','AA9C 9AA','FY10 4PL','SO1 4QQ','EC1A 1BB','W1A 0AX','M1 1AE','B33 8TH','CR2 6XH','DN55 1PT','GIR 0AA','SO10 9AA','FY9 9AA','WC1A 9AA'] 


for x in postcodes: 
    if(re.findall(regex,x)): 
     with open('test2.csv','w',newline='') as fp: 
      a = csv.writer(fp) 
      a.writerows(x) 

Das Problem mit dem Code ist es nicht alle gültigen Postleitzahlen in die CSV-Datei schreibt, statt nur den letzten Postleitzahl (WC1A 9AA) in folgendem Format schreiben:

W 
C 
1 
A 

9 
A 
A 

Ich weiß nicht, wo ich den Fehler mache. Bitte helfen Sie.

+1

Ich glaube, Sie wollen, dass die 'mit offenem (' und der folgenden Zeile, die vor Ihre for-Schleife kommt – jcfollower

+0

Es funktioniert, aber das Problem ist, dass es nur ein Wort in Folge druckt.Zum Beispiel wird die Postleitzahl WC1A 9AA so gedruckt, wie ich in der obigen Frage geschrieben habe. –

+0

'writerows()' erwartet das Argument Da es sich um eine Liste von Zeilen handelt, rufen Sie sie mit einer einzigen Zeichenfolge auf, also teilt sie die Zeichenfolge in eine Liste von Zeichen auf und jedes Zeichen ist eine Zeile – Barmar

Antwort

2

Es gibt ein paar Probleme, aber die größte ist die 'w' - Sie löschen die Datei jedes Mal, wenn Sie darauf schreiben! :) Ändern Sie das zu einem 'a' für append.

Zweitens bin ich nicht sicher, was Sie zu tun versuchen, aber wenn Sie versuchen, sie alle auf separaten Zeilen zu schreiben

codes = [] 
for x in postcodes: 
    if(re.findall(regex,x)): 
     codes.append([x]) 

with open('test2.csv','w',newline='') as fp: 
    a = csv.writer(fp) 
    a.writerows(codes) 
+0

Der Code funktioniert gut, aber das Problem ist es ein Zeichen in einer Spalte zu drucken. Wie die Postleitzahl 'LI10 3QP' wird geschrieben als L, I, 1,0,, 3, Q, P. Ich möchte die vollständige Postleitzahl in einer Spalte wie LI10 3QP schreiben. –

+0

okay Gib mir eine Minute –

+0

versuchst du, jede auf einer separaten Zeile oder alle in einer Zeile zu schreiben? –

0

Ändern Sie den 'w'-'a'-Modus in der open Funktion eher anhängen als die Datei auf jeder Schleife zu überschreiben, oder einfach die innerhalb des with Kontext-Manager für Schleife zu bewegen, wie durch @jcfollower vorgeschlagen.

1

Wenn der offene Dateibefehl mit dem Flag "w" in der Schleife gesetzt wird, löscht er und erstellt in jeder Iteration eine neue Datei, sodass Sie nur die letzte Postleitzahl erhalten. Dies sollten Sie das richtige Ergebnis erhalten:

with open('test2.csv','w',newline='') as fp: 
    for x in postcodes: 
     if(re.findall(regex,x)): 
      a = csv.writer(fp) 
      a.writerows(x) 

Ja, habe ich vergessen. "fp.close()" ist nicht mit der Anweisung "with open" kompatibel.

+1

'with open' schließt die Datei nicht selbst? –

+1

es tut, keine Notwendigkeit für die fp.close() –

+0

Der Code funktioniert gut, aber das Problem ist es ein Zeichen in einer Spalte drucken. Wie die Postleitzahl 'LI10 3QP' wird geschrieben als L, I, 1,0,, 3, Q, P. Ich möchte die vollständige Postleitzahl in einer Spalte wie LI10 3QP schreiben. –