【问题标题】:Write values to a file in python by adding double quotes to the string with spaces通过在带有空格的字符串中添加双引号将值写入python中的文件
【发布时间】:2017-10-16 06:39:20
【问题描述】:

我正在尝试以特定方式将以下列表的值写入 txt 文件中

valList = ['1','Age',' Address has spaces','employee','98363','hobbies has space in it ']

sample.txt

1,Age,"Address has spaces",employee,98363,"hobbies has space in it "

这里如果你看到 valList 是一个异构列表,我唯一的意图是写其中有空格的值用双引号括起来,其余所有值都应该按原样写。 到目前为止,我已经尝试过:

valList = ['1','Age',' Address has spaces','employee','98363','hobbies has space in it ']
# Output = 1,Age,"Address has spaces",employee,98363,"hobbies has space in it "
valstr = ",".join(valList)
with open('sample.txt','wb') as file:
    file.write(valstr)
    file.write('\n' + " \"" + valList[2] + "\" ") 

使用 file.write('\n' + " \"" + valList[2] + "\" ") 行我可以用引号写入单个值, 但我需要一种通用的方法来为给定的列表写入带有空格的值。

任何帮助将不胜感激。

【问题讨论】:

    标签: python file file-format


    【解决方案1】:

    您有 CSV 数据。使用csv module,它会在需要时自动使用引用:

    import csv
    valList = ['1', 'Age', ' Address has spaces', 'employee', '98363', 'hobbies has space in it ']
    with open('sample.txt', 'wb') as file:
        writer = csv.writer(file)
        writer.writerow(valList)
    

    这将根据需要引用值;例如,当字段值中有逗号或换行符时。这不太符合您的确切要求,但兼容的 CSV 阅读器将能够在读取时再次从文件中获取完全相同的值。

    如果您必须在带有空格的列上加上引号,您可以禁用自动引用并手动添加引号:

    import csv
    valList = ['1','Age',' Address has spaces','employee','98363','hobbies has space in it ']
    with open('sample.txt', 'wb') as file:
        writer = csv.writer(file, quoting=csv.QUOTE_NONE, quotechar='')
        writer.writerow(['"{}"'.format(v) if ' ' in v else v for v in valList])
    

    列表推导式用双引号将值中的空格括起来。请注意,由于我们在此处禁用了引用,因此 csv.writer() 将拒绝其中包含 逗号或换行符的值,因为它现在无法引用它们。

    两种方法的演示:

    >>> import sys
    >>> import csv
    >>> valList = ['1', 'Age', ' Address has spaces', 'employee', '98363', 'hobbies has space in it ']
    >>> writer = csv.writer(sys.stdout)
    >>> writer.writerow(valList)
    1,Age, Address has spaces,employee,98363,hobbies has space in it
    >>> writer = csv.writer(sys.stdout, quoting=csv.QUOTE_NONE, quotechar='')
    >>> writer.writerow(['"{}"'.format(v) if ' ' in v else v for v in valList])
    1,Age," Address has spaces",employee,98363,"hobbies has space in it "
    

    【讨论】:

    • 感谢 Martijn 的回复,但不幸的是,第一个答案只有在字符串中有逗号时才有效,而第二个解决方案有错误 '_csv.Error: sequence expected' 。请您再检查一次,
    • @csharpcoder:我更新了第二个选项以使用列表解析,我忘记了 Python 2 CSV 编写器不喜欢迭代器。
    • 在第二个解决方案中仍然出现错误:_csv.Error: need to escape, but no escapechar set
    • @csharpcoder:啊,是的,我们也禁用转义字符。等一下。
    • 谢谢第二个答案就像魅力一样,但为什么要对我的问题投反对票?
    【解决方案2】:
    valList = ['1','Age',' Address has spaces','employee','98363','hobbies has space in it ']
    
    file = open('sample.txt', 'w')
    for item in valList:
        if ' ' in item:
            file.write('"%s",' % item)
        else:
            file.write("%s," % item)
    

    输出

    1,Age," Address has spaces",employee,98363,"hobbies has space in it ",
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 2014-01-02
      • 2013-01-17
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多