在列表中写一个字符串列表,其中可能包含或不包含Python中csv的逗号

时间:2016-10-24 21:22:37

标签: python csv delimiter comma

道歉,如果有一个非常简单的答案。经过两天的搜索,我还没有找到它。

我正在从网站上抓取一个表并通过循环来构建字符串列表。我的代码很有效,直到其中一个值中有逗号。

这就是我构建列表的方式(清楚地省略了循环结构):

.NotDetermined

这导致:

record = (name, availability, upc, price)
productList.append(",".join(item or "" for item in record))

然后我用CSV写入CSV:

[u'Product One, In Stock, 999999999999, $99.99', u'Product Two, In Stock, ....]

直到其中一个产品名称中有逗号为止,它才能正常工作。毫不奇怪,此时它将产品名称分成多个列。

感谢您提供的任何帮助。谢谢。

2 个答案:

答案 0 :(得分:2)

停止手动添加和删除逗号。这就是csv / unicodecsv模块存在的原因,因为你会得到引用错误的内容。

构建行时,将它们设为字段的简单序列(listtuple s),而不是整行作为单个字符串:

productList.append([item or "" for item in record])
# If the or "" is to handle Nones only, module already handles this, so you can simplify:
productList.append(record)

在编写行时,它们的格式已经正确,因此不需要拆分:

with open('data.csv', 'wb') as f
    w = csv.writer(f, delimiter = ",")
    w.writerows(productList)
    # writerows call is just faster way to do:
    # for row in productList: w.writerow(row)

答案 1 :(得分:0)

在你的 void foo(std::map<int,B*> inmap){ std::map<int,B*>::iterator it=inmap.find([Something]); D *pd=dynamic_cast<D*>(it->second); if(pd!=nullptr){ // You know it->second is pointing to an object of type D } else{ // Just an ordinary type B } } 变量中,你已经有了一个元组,对吧?

不要将record添加到您创建的字符串中加入该元组中的值,而只需添加元组本身:

productList

然后,使用record = (name, availability, upc, price) productList.append(record) 编写器的writerow方法直接在文件中写入元组。在packages's web page中显示的示例中,它显示了如何编写元组。该包将负责包含带引号的逗号字符串。

unicodecsv

这会生成一个合适的import unicodecsv as csv productList = [ (u'Product One', u'In Stock', 999999999999, u'$99.99'), (u'Product,Two', u'In Stock', 1234, u'$5.00'), (u'Product Three', u'In Stock', 5678, u'$7.99'), ] with open("foo.csv", "wb") as f: w = csv.writer(f, encoding='utf-8') for product in productList: w.writerow(product)

foo.csv

(请参阅$ cat foo.csv Product One,In Stock,999999999999,$99.99 "Product,Two",In Stock,1234,$5.00 Product Three,In Stock,5678,$7.99 如何正确包裹"Product,Two"?)