【问题标题】:Add space as delimiter in csv.writer在 csv.writer 中添加空格作为分隔符
【发布时间】:2017-09-13 11:10:08
【问题描述】:

我正在尝试从 my_list 1 和 2 输出一个组合

import itertools
import csv

my_list1=["+Red"]
my_list2=["+Lip +Stick","+Magic"]

# Please note: Space is kept intentionally in "+Lip +Stick" above

combinations=itertools.product(my_list1,my_list2)
with open('Txt_of_Keywords.txt','w') as f1:
    writer=csv.writer(f1,lineterminator='\n',)
    for c in combinations:
        writer.writerow(c)

不带分隔符的输出:

+Red,+Lip +Stick
+Red,+Magic

我想在上面的输出中用空格替换逗号。

我尝试使用分隔符添加空格,如下所示:

writer=csv.writer(f1,delimiter=' ',lineterminator='\n',)

带分隔符的输出:

+Red "+Lip +Stick"
+Red +Magic

上面的输出错误地写入引号。这是因为在定义 my_list2 时,“+Lip +Stick”之间有空格。可悲的是,我想要那个空间。

请帮我用空格替换逗号(如上面以粗体突出显示的)。

【问题讨论】:

    标签: python python-3.x csv delimiter


    【解决方案1】:

    为什么引号“不正确”?你写了一个包含空格的值,作者使用引号来确保空格不被视为分隔符。

    如果您不想引用,也可以直接将值写入文件。如果您使用print() function,您将免费获得换行符和空格:

    with open('Txt_of_Keywords.txt','w') as f1:
        for c in combinations:
            print(*c, file=f1)
    

    您不能告诉csv.writer() 对象忽略值中的分隔符;您的选择是引用,使用转义字符,或者如果您同时禁用两者,则会引发错误。您的另一个选择是在分隔符上拆分您的列,但这只是为了使csv 模块工作而做的更多工作,其中您根本不需要使用该模块。 p>

    【讨论】:

    • 天哪,对此的支持并不多……人们因复制某些 python 模块的文档而获得更多支持。可惜。嗯,这至少对我有用。
    【解决方案2】:

    你试图引诱csv 模块进入而不是引用/转义空间。将quoting 设置为csv.QUOTENONE 和/或csv.quotechar 设置为“空”不起作用,会引发如下异常:

    quotechar must be set if quoting enabled
    

    need to escape, but no escapechar set
    

    csv 出于可逆性原因进行了检查以确保它不会发生。

    因此,最好的方法是拆分每个值并将使用此生成器理解获得的令牌列表展平到itertools.chain.from_iterable

    writer.writerow(list(itertools.chain.from_iterable(x.split() for x in c)))
    

    完整示例:

    my_list1=["+Red"]
    my_list2=["+Lip +Stick","+Magic"]
    
    # Please note: Space is kept intentionally in "+Lip +Stick" above
    
    combinations=itertools.product(my_list1,my_list2)
    with open('Txt_of_Keywords.txt','w') as f1:
            writer=csv.writer(f1,lineterminator='\n',delimiter=" ")
            for c in combinations:
                writer.writerow(list(itertools.chain.from_iterable(x.split() for x in c)))
    

    现在我明白了:

    +Red +Lip +Stick
    +Red +Magic
    

    此时您也可以在不使用 csv 模块的情况下编写列表,因为 csv 的主要目的是轻松转义可以与分隔符交互并处理多行的字符(请参阅 Martjin 的新答案) )。

    【讨论】:

    • 这……有点过头了。
    • 看到你的答案,是的,我注意到了 :)(我在你发布之前写了最后一部分,这是我想象的思考过程的一部分)。我仍然对这个答案感兴趣:如果您不需要 csv 模块,请不要使用它:)
    • 这真的是一个“并非一切都是钉子”的问题,他们应该放下 CSV 锤子。
    • 等到你看到我的“使用csv 写入io.StringIO 对象,然后调整它以写入文件:)”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多