【问题标题】:How to f.write .append results to CSV如何将 .append 结果写入 CSV
【发布时间】:2019-05-04 16:20:29
【问题描述】:

我编辑了一些 Python 代码以使用 .append 方法,这意味着我编写 f.write() 的方式将不再有效 (TypeError: can only concatenate list (not "str") to list)。

这是刮板的一部分,我已经测试过并且可以打印。在编辑循环以包含 .append 之前,我使用以下代码行导出到 .csv:

f.write(product_name + "," + product_number + "," + category + "\n")

这将不再有效,我不知道如何编辑它。任何帮助将不胜感激。

我已将循环编辑为如下所示:

containers = page_soup.findAll("tr",{"class":"products"})

product_name = []
product_number = []
category = []

for container in containers:
    product_name.append( container.a.text )
    product_number.append( container.div.text )
    category.append( container.select_one('td:nth-of-type(4)').text.strip() )

我相信我理解添加 .append 方法意味着我不能使用上面显示的 f.write 方法(列表与字符串,对吗?)。当我确实使用上面显示的f.write 代码时,我得到一个“TypeError: can only concatenate list (not "str") to list”,我想我明白了。

我知道我的循环正在工作,因为这段代码会产生正确的结果:

print("product_name:", product_name)
print("product_number:", product_number)
print("category: ", category)

我现在如何将其写入 .csv?

【问题讨论】:

  • 我会推荐使用 pandas 库
  • 你可以使用CSVDictAdapter

标签: python python-3.x string list csv


【解决方案1】:

为避免重复项目两次,您可以简单地在 for 循环内写入文件:

product_names = []
product_numbers = []
categories = []

with open('file.csv','w') as f:
    for container in containers:
            product_name = container.a.text
            product_number = container.div.text
            category =  container.select_one('td:nth-of-type(4)').text.strip() 

            product_names.append(product_name)
            product_numbers.append(product_number)
            categories.append(category)

            f.write(product_name + "," + product_number + "," + category + "\n")

您可能还想使用csv 模块将行写入文件,而不是手动使用字符串连接来创建行:

import csv

with open('file.csv','w') as f:
    csv_out = csv.writer(f)
    for container in containers:
            #...same as above...

            csv_out.writerow([product_name, product_number, category])

【讨论】:

  • 即使它在for 循环中,这是否仍然会给我“TypeError:只能将列表(而不是“str”)连接到列表?
  • 不,因为product_nameproduct_numbercategory 是这里的字符串。为了清楚起见,我将列表名称复数化了。
  • 谢谢。我正在使用它,但收到“AttributeError:'str' object has no attribute 'append'”
  • 检查变量名。我将列表名称更改为product_namesproduct_numberscategories。所以应该是product_names.append() 而不是product_name.append()
  • 是的,您需要在定义中重命名它们,例如。 product_names = [](而不是 product_name = [])。将其添加到我的代码中。
【解决方案2】:

和之前一样,在建立product_nameproduct_numbercategory的全部内容后做,一次做一行:

items = zip(product_name, product_number, category)  # zip these three lists into a single 2D list
with open("my_file.csv", 'w') as f:
    for item in items:
        f.write(f"{item[0]},{item[1]},{item[2]}\n")

如果您遇到比这更复杂的事情,您也可以考虑使用 csv 库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 2013-09-24
    • 2011-09-30
    • 1970-01-01
    相关资源
    最近更新 更多