下面的代码使用正则表达式检查邮政编码的有效性。邮政编码以数组的形式给出。 for循环使用给定的正则表达式检查每个邮政编码的有效性。现在我想将所有有效的邮政编码写入csv文件。以下是我的代码:
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
我不知道我在哪里弄错了。请帮忙。
答案 0 :(得分: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)
答案 1 :(得分:1)
使用标志" w"设置打开文件命令在循环中,它会在每次迭代中删除并创建一个新文件,因此您只能获取最后一个邮政编码。 这应该会得到正确的结果:
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()"与#34;开放"无关紧要言。
答案 2 :(得分:0)
将'w'
函数中的'a'
更改为open
模式以附加而不是覆盖每个循环上的文件,或者只是在with
上下文中移动for循环经理,@ jcfollower建议。