在 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 中追加到列表时出现内存错误的主要内容,如果未能解决你的问题,请参考以下文章