【问题标题】:How do I put single-quotes around string using Python csv writer?如何使用 Python csv writer 在字符串周围加上单引号?
【发布时间】:2013-12-24 11:36:03
【问题描述】:
with open("emails.csv", "w") as csvfile:
    for control_rent_email in control_group_renters:
        email_writer = csv.writer(csvfile, quotechar='"', quoting=csv.QUOTE_NONNUMERIC,delimiter=',')
        email_writer.writerow([control_rent_email])
    csvfile.close()

我在“emails.csv”中得到以下输出:

"susan@gmail.com"
"joe@gmail.com"
"sara@yahoo.com"

但我希望输出是

'susan@gmail.com',
'joe@gmail.com',
'sara@yahoo.com'

如何在 csv.writer() 中输入正确的参数以达到预期的效果?

更新:

1)

email_writer = csv.writer(csvfile, quotechar=''', quoting=csv.QUOTE_NONNUMERIC,delimiter=',')                                                                                            
SyntaxError: EOL while scanning string literal

2)如何放置“,”以看起来像输出结果?

【问题讨论】:

  • 你用过quotechar='"' 为什么不用quotechar="'"
  • Python 有不止一种引用风格;您可以使用"'",也可以使用'\'' 明确转义引号。
  • 看我的回答。您没有放置反斜杠。
  • 我似乎找不到任何可以使用 csv.writer 提供“真实”csv 输出的内容。 “hacky”方法是将电子邮件写入文件中,在 write 语句中添加必要的字符。查看我的编辑。
  • 有没有办法在 csv 模块外引用字符串?

标签: python file csv writer


【解决方案1】:

它看起来是你的quotechar。试试:

with open("emails.csv", "w") as csvfile:
    for control_rent_email in control_group_renters:
        email_writer = csv.writer(csvfile, quotechar="'", quoting=csv.QUOTE_NONNUMERIC,delimiter=',')
        email_writer.writerow([control_rent_email])
    csvfile.close()

【讨论】:

    【解决方案2】:

    您应该将引号字符更改为quotechar="'"

    在您的代码中,您已明确指定引号字符应为双引号。

    【讨论】:

    • 我认为您的意思是明确将其设置为 single 引号。
    • @martineau 不,在问题中引号字符是单引号。这就是需要更改引号字符的原因。
    【解决方案3】:

    按照其他人的说明更改引号字符或使用反斜杠转义。

       email_writer = csv.writer(csvfile, quotechar='\'', quoting=csv.QUOTE_NONNUMERIC,delimiter=',')
    

    我们似乎忽略了您的第二个问题:

    这是一个 hack,因为我似乎无法弄清楚如何使用 csv 模块来做到这一点。与其使用csv.writer 编写文件,不如试试这种方式:

    for control_rent_email in control_group_renters:
        csvfile.write('\'' + control_rent_email + '\'' + ',')
    

    你也不需要显式地close你正在写入的文件,因为你打开它的方式是在它不再被引用时这样做。

    希望有人可以找出如何以一种不那么黑客的方式做到这一点,尤其是使用csv.writer。不过,这种方式会满足您的需求。

    【讨论】:

    • 这似乎是对的。鉴于 OP 的要求,使用 csv 模块似乎是真正的技巧。
    • @alexis 那么不只是我一个人吗?我搜索并测试了一下,看看它是否可行,但除了我上面提到的之外,我想不出一个解决方案。我认为csv 模块会很容易做到这一点。
    • CSV 模块用于生成 CSV 格式的变体。你有没有注意到他不想在最后一行后面加逗号?为什么要在不需要引用但有尾随逗号的字符串周围加上引号?那不是 CSV。您可以使用QUOTE_NONE,手动插入周围的引号(如上所述),并传递一个空字符串以触发尾随逗号(请参阅我的答案)。正如我所说,您的解决方案更合适。
    【解决方案4】:

    csv 写入器是一种可用于将多行 行写入文件的设备。您应该只创建一个。告诉它使用单引号作为引号字符,并以这种方式使用它:

    with open("emails.csv", "w") as csvfile:
        email_writer = csv.writer(csvfile, quotechar="'", quoting=csv.QUOTE_NONNUMERIC,delimiter=',')
        for control_rent_email in control_group_renters:
            email_writer.writerow([control_rent_email])
    

    我希望你给出一个你真正需要的简化例子;否则,当您每行只打印一个字符串时,为什么还要麻烦呢?如果您真的想在每一行末尾添加逗号除了最后一行,您真的不是针对任何类型的 CSV,您应该直接构建输出。

    也就是说,您可以通过将空字符串传递给writerow 来获得尾随逗号,但前提是您使用QUOTE_MINIMALQUOTE_NONE(这将抑制电子邮件周围的无意义引号),而不是QUOTE_NONNUMERIC ;否则你会得到空字符串的引号。

    email_writer.writerow([control_rent_email, ""])
    

    为了完整起见,以下是您可以真正准确生成所需输出的方法,而无需最后的逗号和所有内容:

    with open("emails.txt", "w") as output:
        output.write( ",\n".join("'"+r+"'" for r in control_group_renters) +"\n" )
    

    【讨论】:

      猜你喜欢
      • 2015-02-17
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 2022-01-18
      • 2018-11-17
      • 1970-01-01
      相关资源
      最近更新 更多