首页 > 解决方案 > 使用 Pandas DataFrame 向现有 CSV 添加新行

问题描述

我正在尝试向现有csv文件添加新行。新row的来自 a for loopwhich is appendedtostring list并被保存到 a DataFrame。我不希望整个loop保存在内存中,然后保存到csv文件中。我更喜欢将每一行添加到文件中,在循环迭代时单独更新它,因为它是一个长时间运行的循环,不必等到整个循环完成。

我能够遍历该组,但它会导致重复的行。

names = []
addresses = []
pages = np.arange(10300, 10400, 1)

for page in pages:

    page = requests.get(
        "https://www.testpage.com/" + str(page), headers=headers)

    soup = BeautifulSoup(page.text, 'html.parser')

    company = soup.find_all('main')

    for container in company:

        name = container.find("b", {"id": "company_name"})
        names.append(name.text.strip())

        address = container.find('div', attrs={'class': 'text location'})
        addresses.append(address.text.strip())

    companies=pd.DataFrame({
        'name': names,
        'address': addresses
    })

    companies.to_csv(r'b_10300_10400.csv', mode='a', header=False)

有什么想法吗?

标签: pythonpandasdataframebeautifulsoup

解决方案


使用构建的标准csv模块来一次写入一行内容。你没有做任何pandas相关的处理,它只是碍事。

import csv

pages = np.arange(10300, 10400, 1)

with open('b_10300_10400.csv', mode='a', newline='') as outfile:

    writer = csv.writer(outfile)

    for page in pages:
    
        page = requests.get(
            "https://www.testpage.com/" + str(page), headers=headers)
    
        soup = BeautifulSoup(page.text, 'html.parser')
    
        company = soup.find_all('main')
    
        for container in company:
    
            name = container.find("b", {"id": "company_name"}).text.strip()
            address = container.find('div', attrs={'class': 'text location'}).text.strip()
            writer.writerow((name, address))

推荐阅读