【问题标题】:Add new row to existing CSV using Pandas DataFrame使用 Pandas DataFrame 向现有 CSV 添加新行
【发布时间】:2021-01-16 22:07:15
【问题描述】:

我正在尝试向现有 csv 文件添加新行。新的row 来自for loop,即appendedstring list,并保存到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)

有什么想法吗?

【问题讨论】:

    标签: python pandas dataframe beautifulsoup


    【解决方案1】:

    使用标准的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))
    

    【讨论】:

      【解决方案2】:

      您应该在每次循环中重置namesaddresses 变量:

      pages = np.arange(10300, 10400, 1)
      
      for page in pages:
          names = []
          addresses = []
      
          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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-13
        • 1970-01-01
        • 1970-01-01
        • 2020-11-07
        • 2017-08-09
        • 2019-04-28
        相关资源
        最近更新 更多