【问题标题】:Write text with comma into a cell in CSV file using python使用python将带逗号的文本写入CSV文件中的单元格
【发布时间】:2011-03-29 09:34:33
【问题描述】:

我想将带逗号的文本写入 CSV 文件中的单元格。

输入

'1,2,3,Hello'

CSV 中的输出应该是

'1,2,3','Hello'

【问题讨论】:

    标签: python csv


    【解决方案1】:

    这不是 Python 特有的,而是与 CSV "standard" 有关。

    如果你想写一个控制字符作为你的值的一部分,你需要用双引号括起来来转义这个值:

    f.write('1,2,3,45,"The Next comma I want to write and not separate to another cell, so this sentence will be whole",6,7,8')
    

    编辑:尽管在实践中,使用其他人建议的 CSV 编写器接口会更好。当有一个现成的库可以为您抽象出来时,将自己卷入实现细节绝不是一个好主意。

    【讨论】:

    • 您需要在末尾添加一个行终止符;与print 不同,write 方法不会为您提供一个。
    【解决方案2】:

    文件的每一行都是一个数据记录。每条记录由一个或多个字段组成,以逗号分隔。

    用逗号分隔字段的基本思想很明确,但是当字段数据也可能包含逗号甚至嵌入换行符时,这个想法就会变得复杂。

    CSV 实现可能无法处理此类字段数据,或者它们可能使用引号将字段括起来。 -- 来自https://en.wikipedia.org/wiki/Comma-separated_values

    因此您可以使用引号将每个字段文本括起来。

    假设输入是['1,2,3', 'Hello'],输出到CSV应该是"1,2,3", "Hello",你可以使用下面的代码来实现。

    >>> ",".join('"{0}"'.format(s) for s in ['1,2,3', 'Hello'])
    '"1,2,3","Hello"'
    

    但是当文本中有"\n等特殊符号时,你会遇到问题。

    python csv 库已经为您处理了所有边缘情况。

    写入文件

    可以使用@Dominic Rodger 回答。

    >>> import csv
    >>> spamWriter = csv.writer(open('eggs.csv', 'wb'))
    >>> spamWriter.writerow(['Spam', 'Lovely, Spam'])
    

    写入字符串

    来自https://stackoverflow.com/a/9157370/5238892

    在 Python 3 中:

    >>> import io
    >>> import csv
    >>> output = io.StringIO()
    >>> csvdata = [1,2,'a','He said "what do you mean?"',"Whoa!\nNewlines!"]
    >>> writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC)
    >>> writer.writerow(csvdata)
    59
    >>> output.getvalue()
    '1,2,"a","He said ""what do you mean?""","Whoa!\nNewlines!"\r\n'
    

    Python 2 的一些细节需要稍作改动:

    >>> output = io.BytesIO()
    >>> writer = csv.writer(output)
    >>> writer.writerow(csvdata)
    57L
    >>> output.getvalue()
    '1,2,a,"He said ""what do you mean?""","Whoa!\nNewlines!"\r\n'
    

    【讨论】:

      【解决方案3】:

      使用正确的CSV writers:

      >>> import csv
      >>> spamWriter = csv.writer(open('eggs.csv', 'wb'))
      >>> spamWriter.writerow(['Spam', 'Lovely, Spam'])
      

      输出:

      垃圾邮件,“可爱,垃圾邮件”

      【讨论】:

      • 我得到了下一个错误:AttributeError: '_csv.writer' object has no attribute 'writer'。有没有办法在没有 CSV 模块的情况下做到这一点?
      • -1 未以二进制模式打开 csv 输出文件。 Windows 上的输出:'Spam,"Lovely, Spam"\r\r\n'
      • @John - errr - 是的,根据 Python 文档 - docs.python.org/release/2.6.4/library/csv.html#csv.writer
      • @John - 很公平,改变了。
      • @Dominic:大概你指的是这个例子。您没有注意到前面有些含糊的评论:“”“如果 csvfile 是一个文件对象,则必须在有区别的平台上使用‘b’标志打开它。”“”。 Windows 是它确实发挥作用的平台。合理的做法是始终在输入和输出文件上使用二进制模式——这使得脚本或新手建议与平台无关。
      猜你喜欢
      • 2015-01-05
      • 2012-10-05
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多