我有一个scrapy python刮刀。在这个项目中,我总是使用with
语句来处理文件,就像这样:
with open('file2.json', 'r', encoding="utf8") as file_data:
datas = json.load(file_data)
但是当我想关闭此文件时,我收到此错误:
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'file2.json'
应该删除此文件的代码是:
filename = 'file2.json'
if os.path.exists(filename):
os.remove(filename)
我尝试了一些方法来解决这个问题,但它没有帮助,第一个是删除之前的代码:
os.chmod(filename, 0o777)
第二个是在删除之前打开和关闭文件:
fn = open(filename, 'r')
fn.close()
这些方法都不起作用,我仍然因删除此文件而获得权限错误。有没有办法关闭Python垃圾收集器中的所有打开文件?我该如何解决这个问题?
答案 0 :(得分:1)
我知道这则帖子很旧,但是可能还有其他人遇到此问题。这就是我设法处理它的方式。
在我的情况下,刮板在完成后打开文件处理程序的问题是在我的蜘蛛无法产生值或我试图通过Marker_Color = "Red" #@param ["Red", "Green", "Blue", "Black", "Yelow", "Purple", "Orange"]
Marker_Size = 961 #@param {type:"slider", min:1, max:1000, step:1}
Display_Coordinates = True #@param {type:"boolean"}
Add_Legend = False #@param {type:"boolean"}
Add_More_Markers = False #@param {type:"boolean"}
异常关闭蜘蛛时发生的。
因此,我要做的是产生一个可以立即在以后跟踪的单个垃圾值,而不是中断蜘蛛程序或避免其产生值:
CloseSpider
我知道这是一团糟,必须有更好的方法来做到这一点,但没有人提供(至少我下班后找不到)。
class Scraper(scrapy.Spider):
# your spider's attributes (name, domains, start urls, etc)
scrape = True
trashYielded = False
def parse(self, response):
for href in response.css('my selector'):
if href == 'http://foo.bar':
self.scrape = False
if self.scrape:
# Here you yield your values as you would normally
yield {'url': href}
else:
if not self.trashYielded:
yield {'trashKey': 'trashValue'}
self.trashYielded = True
变量告诉您的蜘蛛是否必须继续抓取,而scrape
告诉您是否抛出了垃圾值(这样,我们仅抛出一个垃圾值)。
在我的示例中,当我找到指向特定页面的链接时,我想停止抓取,并且当我找到它时,我将trashYielded
变量设置为scrape
(这意味着我不想继续抓取)。
接下来,我只会产生False
的值,否则检查蜘蛛是否抛出了垃圾值(如果没有,则进行处理)。
在处理数据时,应该只检查数据之间是否存在“ trashKey”并将其丢弃。
希望这可以帮助任何人(或吸引可以带来更好方法的人)^^