【问题标题】:how to encode a paragraph for use in a CSV file in python如何编码段落以在python中的CSV文件中使用
【发布时间】:2011-10-26 03:18:12
【问题描述】:

我对 python 完全陌生,正在努力使一个简单的事情发挥作用。

我正在从 Web 服务读取一堆信息,解析结果,我想将其写入一个平面文件。我的大部分项目都是单行项目,但我从 Web 服务中得到的其中一个项目是一个段落。该段落将包含换行符、引号和任何随机字符。

我打算为 python 使用 CSV 模块,但不确定我应该使用的参数以及如何转义我的字符串,以便将段落放在一行中,因此我可以保证所有字符都正确转义(尤其是分隔符)

【问题讨论】:

    标签: python csv


    【解决方案1】:

    默认的csv.writer 设置应该能正确处理这个问题。这是一个简单的例子:

    import csv
    
    myparagraph = """
    this is a long paragraph, with "quotes" and stuff.
    """
    
    mycsv = csv.writer(open('foo.csv', 'wb'))
    mycsv.writerow([myparagraph, 'word1'])
    mycsv.writerow(['word2', 'word3'])
    

    这会产生以下 csv 文件:

    "
    this is a long paragraph, with ""quotes"" and stuff.
    ",word1
    word2,word3
    

    它应该毫无问题地加载到您最喜欢的 csv 打开工具中,因为它有两行和两列。

    【讨论】:

    • 啊,这很简单!生成的 CSV 文件显示在多行上并不重要吗?我期待看到逃脱\n
    • 我现在收到此错误:UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b3' in position 7: ordinal not in range(128)
    • @pocketfullofcheese:在 Stackoverflow 中搜索“[python] csv UnicodeEncodeError”...如果这和 csv 的 Python 文档对您没有帮助,请开始另一个问题。
    • 不确定它是否正确,但我最终将 .encode('utf-8') 添加到字符串中,然后再将它们写入 CSV。谢谢。
    • @pocketfullofcheese:如果 CSV 文件的使用者期待 UTF-8 或可以检测到并处理它,那没关系。非常重要:Excel 不是这样的消费者!
    【解决方案2】:

    您不必做任何特别的事情。 CSV 模块会为您处理报价。

    >>> from StringIO import StringIO
    >>> s = StringIO()
    >>> w = csv.writer(s)
    >>> w.writerow(['the\nquick\t\r\nbrown,fox\\', 32])
    >>> s.getvalue()
    '"the\nquick\t\r\nbrown,fox\\",32\r\n'
    >>> s.seek(0)
    >>> r = csv.reader(s)
    >>> next(r)
    ['the\nquick\t\r\nbrown,fox\\', '32']
    

    【讨论】:

      【解决方案3】:

      为了帮助您设定期望,以下是在事实上的标准 CSV 输出中引用等如何工作的可执行伪代码:

      >>> def csv_output_record(input_row):
      ...     delimiter = ','
      ...     q = '"' # quotechar
      ...     quotables = set([delimiter, '\r', '\n'])
      ...     return delimiter.join(
      ...         q + value.replace(q, q + q) + q if q in value
      ...         else q + value + q if any(c in quotables for c in value)
      ...         else value
      ...         for value in input_row
      ...         ) + '\r\n'
      ...
      >>> csv_output_record(['foo', 'x,y,z', 'Jack "Ripper" Jones', 'top\nmid\nbot'])
      'foo,"x,y,z","Jack ""Ripper"" Jones","top\nmid\nbot"\r\n'
      

      注意没有转义,只有引用,因此如果quotechar出现在字段中,它必须加倍。

      【讨论】:

        猜你喜欢
        • 2020-09-02
        • 1970-01-01
        • 1970-01-01
        • 2019-05-05
        • 1970-01-01
        • 2017-08-14
        • 2019-02-22
        • 1970-01-01
        • 2014-10-14
        相关资源
        最近更新 更多