2017-01-28 3 views
2

Мой код ниже проверяет правильность почтовых индексов с регулярным выражением. Почтовые индексы даются в виде массива. Цикл for проверяет достоверность каждого почтового индекса с заданным регулярным выражением. Теперь я хочу написать все допустимые почтовые индексы в файл csv. Ниже мой код:запись данных в файл csv в 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) 

Проблема с кода он не запишет все действительные почтовые индексы в файл CSV, вместо этого он только писать последний почтовый индекс (WC1A 9AA) в следующем формате:

W 
C 
1 
A 

9 
A 
A 

Я не знаю, где я делаю ошибку. Пожалуйста помоги.

+1

Я думаю, вы хотите 'с открытым (' и следующее строка, которая должна быть до вашего цикла for – jcfollower

+0

Работает, но проблема заключается в том, что она печатает только одно слово в строке. Например, почтовый индекс WC1A 9AA печатается так же, как я писал в вопросе выше. –

+0

'writerows()' ожидает аргумент быть списком строк, вы вызываете его одной строкой, поэтому он разбивает строку на список символов, а каждый символ представляет собой строку. – Barmar

ответ

2

Есть несколько вопросов, но самый большой из них - 'w' - вы уничтожаете файл каждый раз, когда вы его пишете! :) Измените это на 'a' для добавления.

Во-вторых, я не уверен, что вы пытаетесь сделать, но если вы пытаетесь записать их все на отдельно рядами

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

Код работает нормально, но проблема заключается в том, что он печатает один символ в столбце. Подобно почтовому индексу «LI10 3QP» записывается как L, I, 1,0,, 3, Q, P. Я хочу написать полный почтовый индекс в одном столбце, таком как LI10 3QP. –

+0

okay gimme a minute –

+0

Вы пытаетесь написать каждый в отдельной строке или все в одной строке? –

0

Изменение режима 'w' к 'a' в функции open для добавления, а не перезаписывать файл на каждом цикле, или просто переместить цикл внутри менеджера with контекста, как это было предложено @jcfollower.

1

С командой открытого файла с флагом «w» в Loop он удаляет и создает новый файл на каждой итерации, поэтому вы получаете только последний почтовый индекс. Это вы должны получить правильный результат:

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

Да, я забыл. «fp.close()» неинтересно с оператором «с открытым».

+1

'with open' не закрывает файл сам по себе? –

+1

Это не нужно для fp.close() –

+0

Код работает нормально, но проблема заключается в том, что он печатает один символ в столбце. Подобно почтовому индексу «LI10 3QP» записывается как L, I, 1,0,, 3, Q, P. Я хочу написать полный почтовый индекс в одном столбце, таком как LI10 3QP. –

Смежные вопросы