【问题标题】:write data into csv file in python在python中将数据写入csv文件
【发布时间】:2017-01-28 23:37:59
【问题描述】:

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

我不知道我在哪里犯了错误。请帮忙。

【问题讨论】:

  • 我认为您希望 with open( 和以下行出现在您的 for 循环之前
  • 它可以工作,但问题是它只连续打印一个单词。例如,邮政编码 WC1A 9AA 就像我在上面的问题中写的那样打印。
  • writerows() 期望参数是行列表,您使用单个字符串调用它。所以它将字符串拆分成一个字符列表,每个字符都是一行。
  • 您应该致电writerow() 一次写入一行。
  • 您还可以使用列表推导来获取与正则表达式匹配的所有邮政编码的列表,然后将其写入writerows()

标签: python export-to-csv


【解决方案1】:

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

【讨论】:

  • 代码工作正常,但问题是它在一列中打印一个字符。就像邮政编码 'LI10 3QP' 写成 L,I,1,0, ,3,Q,P。我想在 LI10 3QP 之类的一栏中写完整的邮政编码。
  • 你是想把每一个写在单独的行上还是全部写在一行上?
  • 每个邮政编码在单独的行中,但完整的邮政编码在一列中。
  • 类似这样的:'WC1 100' 在第一行第一列,'LC12 P12' 在第二行第一列,'QW12 O23' 在第三行第一列......
【解决方案2】:

通过在循环中设置带有标志“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" 语句无关。

【讨论】:

  • with open 不会自行关闭文件?
  • 可以,不需要 fp.close()
  • 代码工作正常,但问题是它在一列中打印一个字符。就像邮政编码 'LI10 3QP' 写成 L,I,1,0, ,3,Q,P。我想在 LI10 3QP 之类的一栏中写完整的邮政编码。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2015-01-21
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    相关资源
    最近更新 更多