【问题标题】:Write a list of strings in a list that may or may not contain commas to a csv in Python在 Python 中将可能包含或不包含逗号的列表中的字符串列表写入 csv
【发布时间】:2016-10-24 21:22:37
【问题描述】:

如果对此有一个非常简单的答案,我们深表歉意。找了两天也没找到。

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

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

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

这会导致:

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

然后我将其写入 CSV:

import unicodecsv as csv

...

f = open('data.csv', 'wb')
w = csv.writer(f, delimiter = ",")
w.writerow([x.split(',') for x in productList])
f.close()

在其中一个产品名称中有逗号之前效果很好。毫不奇怪,此时它会将产品名称分成多列。

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

【问题讨论】:

  • @UrielEli:这只是意味着如果波浪号正常出现在字段中,它会在读取时转换为逗号。解决方案是让csv 模块完成其工作,以便为您处理报价。
  • @ShadowRanger:谢谢!我实施了您对 productList.append 的建议编辑以及对代码编写部分的调整。 (一旦我的胖手指错字被修正)它就像一个冠军!谢谢。

标签: python csv delimiter comma


【解决方案1】:

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

在构建行时,将它们设为字段的纯序列(lists 或 tuples),而不是将整行作为单个字符串:

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)

【讨论】:

  • 如果我知道正确的反应会来得这么快,我昨天就问了。
【解决方案2】:

在您的 record 变量中,您已经有一个元组,对吧?

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

record = (name, availability, upc, price)
productList.append(record)

然后,使用unicodecsv writer 的writerow 方法将元组直接写入文件中。在packages's web page 中显示的示例中,它显示了如何编写元组。该包将负责将包含逗号的字符串用引号括起来。

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" 是如何被" 正确包装的?)

【讨论】:

    猜你喜欢
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2016-04-15
    • 2022-11-10
    相关资源
    最近更新 更多