Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python将数据写入csv文件_Python_Export To Csv - Fatal编程技术网

用python将数据写入csv文件

用python将数据写入csv文件,python,export-to-csv,Python,Export To Csv,下面的代码使用正则表达式检查邮政编码的有效性。邮政编码以数组的形式给出。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])

下面的代码使用正则表达式检查邮政编码的有效性。邮政编码以数组的形式给出。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

我不知道我在哪里犯了错误。请提供帮助。

打开
函数中将
'w'
更改为
'a'
模式,以附加而不是覆盖每个循环上的文件,或者按照@jcclopper的建议,使用上下文管理器将for循环移动到
中。

使用在循环中设置了标志“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()”不需要使用“with open”语句。

存在一些问题,但最大的问题是
'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)

我想您希望在for loop之前有open(
和以下行)的
,但问题是它一行只打印一个单词。例如,邮政编码WC1A 9AA的打印方式与我在上述问题中所写的方式相同。
writerows()
希望参数是一个行列表,您使用单个字符串调用它。因此,它将字符串拆分为一个字符列表,每个字符都是一行。您应该调用
writerow()
一次写入一行。您还可以使用列表理解来获取与regexp匹配的所有邮政编码的列表,然后使用
writerows()写入该列表。
使用open
不会自动关闭文件吗?它会关闭,不需要fp.close()代码工作正常,但问题是它在一列中打印一个字符。就像邮政编码“LI10 3QP”写为L,I,1,0,3,Q,P。我想在一列中像LI10 3QP一样写完整的邮政编码。代码工作正常,但问题是它在一列中打印一个字符。就像邮政编码“LI10 3QP”写为L,I,1,0,3,Q,P。我想写t他在一列中填写完整的邮政编码,如LI10 3QP。你是想把每个邮政编码都写在一行中还是全部写在一行中?每个邮政编码在一行中,但完整的邮政编码在一列中。类似这样的内容:第一行第一列中的“WC1 100”,第二行第一列中的“LC12 P12”,第三行第一列中的“QW12 O23”……让我们来看看。