在 Python 中追加到列表时出现内存错误

Posted

技术标签:

【中文标题】在 Python 中追加到列表时出现内存错误【英文标题】:Memory error when appending to list in Python 【发布时间】:2017-11-30 15:48:12 【问题描述】:

我有一个包含 8000 个网站网址的列表。我想从网站上刮下文本并将所有内容保存为 csv 文件。为此,我想将每个文本页面保存在列表中。到目前为止,这是我的代码,它正在产生“MemoryError”。

import os
from splinter import *
import csv
import re
from inscriptis import get_text
from selenium.common.exceptions import WebDriverException


executable_path = 'executable_path' :'./phantomjs'
browser = Browser('phantomjs', **executable_path)
links = []


with open('./Hair_Salons.csv') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',')
    for row in spamreader:
        for r in row:
            links.append(r)

for l in links:
    if 'yelp' in l:
        links.remove(l)

df = []

for k in links:
    temp = []
    temp2 = []
    browser.visit(k)

    if len(browser.find_link_by_partial_text('About'))>0:
        about = browser.find_link_by_partial_text('About')
        print(about['href'])
        try:
            browser.visit(about['href'])
            temp.append(get_text(browser.html)) # <----- This is where the error is occuring
        except WebDriverException:
            pass
    else:
        browser.visit(k)
        temp.append(get_text(browser.html))
    for s in temp:
        ss = re.sub(r'[^\w]', ' ', s)
        temp2.append(ss)

    temp2 = ' '.join(temp2)
    print(temp2.strip())

    df.append(temp2.strip())

with open('Hair_Salons text', 'w') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(df)

如何避免出现内存错误?

【问题讨论】:

在循环期间将数据发送到文件,而不是全部保存到以后 @doctorlove 我该怎么做?我已经尝试过了,但似乎每次循环循环时都会覆盖我的文件。 您应该在每次转到下一个站点时清除“browser = Browser('phantomjs', **executable_path)”。像“driver.quit()”这样的东西。这可能是您的内存问题。 【参考方案1】:

如果您无法将所有数据保存在内存中,请不要这样做。 概括地说,您的代码具有这种结构

for k in links:
    temp = []
    temp2 = []
    browser.visit(k)

    # do stuff that fills in temp

    for s in temp:
        ss = re.sub(r'[^\w]', ' ', s)
        temp2.append(ss)

    temp2 = ' '.join(temp2)
    print(temp2.strip())

    df.append(temp2.strip())

with open('Hair_Salons text', 'w') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(df)

因此,您将大量内容放入数据框中,然后编写它 - 您不会在循环中使用它。而不是df.append(temp2.strip()) 写入那里的文件。 让您要么在循环外打开文件一次(可能更明智),要么打开以追加(使用'a' 而不是'w')。

【讨论】:

我想我明白了,但是到目前为止,每次循环运行时都不会打开文件,对吗?我的印象是,一旦所有文本都在 df 中,它就会打开一次。内存问题似乎在 temp.append(get_text(browser.html)) 那是正确的 - 在(尝试)将所有数据读入内存之后,您似乎打开了一次文件。我建议在循环之前打开它一次以读取数据并一次写入一行。或者可能在循环中重新打开,但这有点愚蠢。 好的,我回家试试,如果成功就接受!

以上是关于在 Python 中追加到列表时出现内存错误的主要内容,如果未能解决你的问题,请参考以下文章

mysql安装时出现错误

在 Python 中使用重载加法运算符时出现内存错误

为啥在比较列表项时出现内存不足异常?

在 ListView 中使用 LazyList 时出现内存不足错误 [重复]

Python 转换为数组时出现内存错误

访问共享内存时出现分段错误