在csv.writer

时间:2017-09-13 11:10:09

标签: python python-3.x csv delimiter

我正在尝试从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

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

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

2 个答案:

答案 0 :(得分:2)

为什么报价不正确'?您编写了一个包含空格的值,编写者使用引号来确保空格不被视为分隔符。

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

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

您无法告诉csv.writer()对象忽略值中的分隔符;您的选择是在引用之间,使用转义字符,或者如果同时禁用两者,则会引发错误。您的另一个选择是将您的列拆分为分隔符,但只需使csv模块正常工作,您真的不需要使用该模块所有

答案 1 :(得分:0)

你试图引诱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)新答案)。