如何在单个 CSV 文件中保存多个列表?

Posted

技术标签:

【中文标题】如何在单个 CSV 文件中保存多个列表?【英文标题】:How to save multiple lists in a single CSV file? 【发布时间】:2021-05-18 17:55:36 【问题描述】:

我有以下 python bode 生成两个列表作为输出。第一个列表是作者列表,我希望它出现在第二列(相当于 Excel 中的 B 列),第二个列表是标题列表,我希望它出现在第三列(C 列)中。控制台中的当前输出是这样的:

***FAILED TO DOWNLOAD*** http://grupodyasa.com/14-gauge-qvb0w/pipsc-collective-agreement-2019.html,
28  contents successfully fetched, 
1 failed to fetch 

目前有3个错误:

    它们都在一个列中(Excel 中的 A 列) 标题与后续字母写在同一列,每个字母占一行/行。 我希望异常的统计信息应该反映在文件中(在每一行的末尾):1.当代码没有获取作者姓名时,2.当代码没有获取标题时),3.上面所有当代码没有从 URL 下载任何东西时。

我的代码如下:

from newspaper import Config
from newspaper import Article
from newspaper import ArticleException
import csv

USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Firefox/78.0'

config = Config()
config.browser_user_agent = USER_AGENT
config.request_timeout = 10

file1 = open('laborAuthorTitle4.csv', 'w') 
w = csv.writer(file1)
count1=0
failCount=0
titleFail=0
authorFail=0
article_authors=[]

row1=[]

with open('laborURL29.csv', 'r') as file:
    csv_file = file.readlines()
    for url in csv_file:
        try:
            article = Article(url.strip(), config=config)
            article.download()
            article.parse()
            article_authors=article.authors
            for persons in article_authors:
                try:
                    my_row = []
                    my_row.append(persons)
                    w.writerow(my_row)
                except ArticleException:
                    print('***FAILED TO FETCH AUTHOR***', article.url)
                    authorFail=authorFail+1
                    print('Total fails', authorFail)
            article_titles=article.title
            for thema in article_titles:
                try:
                    my_row2 = []
                    my_row2.append(thema)
                    w.writerow(my_row2)
                except ArticleException:
                    print('***FAILED TO EXTRACT A TITLE***', article.url)
                    titleFail=titleFail+1
                    print('Total fails', titleFail)
            count1=count1+1
        except ArticleException:
            print('***FAILED TO DOWNLOAD***', article.url)
            failCount=failCount+1
file1.close()
print(count1, " contents successfully fetched")
print(failCount, "failed to fetch ")

创建/写入的 csv 文件在这里laborAuthors11

这是开头的截图:

【问题讨论】:

我无法运行您的代码,但从生成的 CSV 文件来看,您似乎在传递 writerow() 一个字符串作为参数,而不是 list — 所以它会解释每个 字符串的字符作为单独的行。 您是否查看了我之前与您分享的概览文档中的保存提取的数据部分?我将介绍如何保存到 CSV、JSON、HTML 和数据帧。 @Lifeiscomplex,不,我没有注意到它的存在。我会检查的。 【参考方案1】:

刚刚阅读了这段代码:

        for persons in article_authors:
            my_row = []
            my_row.append(persons)
            w.writerow(my_row)
        article_titles=article.title
        for thema in article_titles:
            my_row2 = []
            my_row2.append(thema)
            w.writerow(my_row2)

我发现两个潜在问题:

    您正在编写行之前所有值都被附加 您正在迭代 article.title,很可能是一个字符串,并一个接一个地附加字符(因此,为什么每一行都包含一个字符,而不是完整的标题)

我认为你的代码应该是这样的:

            row = []
            row.append(article_authors[0])  # take the first author
            row.append(article.title)
            w.writerow(row)

这可能是 100% 正确的,但它应该能让你朝着正确的方向前进。

【讨论】:

我以这种方式获取文章作者:对于 article_authors 中的人员:如果人员:my_row = [] my_row.append(persons) w.writerow(my_row) else: w.writerow('Failed') article_titles =article.title my_row.append(article_titles) #### 但是作者和标题现在在同一列,如何将标题放在第二列?

以上是关于如何在单个 CSV 文件中保存多个列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何将mysql多个outfiles转换成单个压缩zip

如何将单个工作表中的多行(在 excel 中)转换为多个 CSV 文件

如何使用 gsutil 将多个 csv 文件连接成一个具有单个标题的 csv 文件

如何将多个 csv 文件合并为单个 csv 文件

如何使用 Pandas 将多个 csv 文件中的单个数据列合并为一个?

如何将数据从单个 csv/excel 文件传输到多个 oracle 表