Python 无法有条件地删除某些csv文件
我用python编写了一个脚本,从网页中获取一些表格内容,并将其写入csv文件。我现在想做的是,仅当表格(显示为Python 无法有条件地删除某些csv文件,python,python-3.x,csv,web-scraping,Python,Python 3.x,Csv,Web Scraping,我用python编写了一个脚本,从网页中获取一些表格内容,并将其写入csv文件。我现在想做的是,仅当表格(显示为顶级共同基金持有人)在该页面中可用时,才允许我的脚本将内容写入csv文件,否则它将删除已创建的csv文件 这张桌子在这张桌子上 我要找的那张桌子在这里没有 这是我的尝试: import os import csv import requests from bs4 import BeautifulSoup url = "https://finance.yahoo.com/quote/U
顶级共同基金持有人
)在该页面中可用时,才允许我的脚本将内容写入csv文件,否则它将删除已创建的csv文件
这张桌子在这张桌子上
我要找的那张桌子在这里没有
这是我的尝试:
import os
import csv
import requests
from bs4 import BeautifulSoup
url = "https://finance.yahoo.com/quote/UBER/holders?p=UBER"
def get_mutual_fund(soup):
datalist = []
for items in soup.select_one("h3:contains('Top Mutual Fund Holders')").find_next_sibling().select("table tr"):
data = [item.text for item in items.select("th,td")]
datalist.append(data)
return datalist
def get_records(link):
r = requests.get(link)
soup_obj = BeautifulSoup(r.text,"lxml")
try:
item_one = get_mutual_fund(soup_obj)
except AttributeError:
item_one = ""
if item_one:
writer.writerows(item_one)
else:
os.remove("mutual_fund.csv")
return item_one
if __name__ == '__main__':
with open("mutual_fund.csv","w",newline="") as f:
writer = csv.writer(f)
for elem in get_records(url):
print(elem)
我尝试过使用没有该表的链接。但是,它抛出以下错误
while deleting the csv file:
Traceback (most recent call last):
File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\demo.py", line 33, in <module>
for elem in get_records(url):
File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\demo.py", line 27, in get_records
os.remove("mutual_fund.csv")
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'mutual_fund.csv'
删除csv文件时:
回溯(最近一次呼叫最后一次):
文件“C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\demo.py”,第33行,在
对于get_记录中的元素(url):
文件“C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\demo.py”,第27行,在get\U记录中
os.remove(“互惠基金.csv”)
PermissionError:[WinError 32]进程无法访问该文件,因为另一进程正在使用该文件:“mutual_fund.csv”
当表格内容不存在时,如何删除csv文件?当文件打开写入时,您实际上是在删除该文件 你应该相应地改变你的主要功能
def get_records(link):
r = requests.get(link)
soup_obj = BeautifulSoup(r.text,"lxml")
try:
item_one = get_mutual_fund(soup_obj)
except AttributeError:
item_one = None
return item_one
if __name__ == '__main__':
delete_file= False
with open("mutual_fund.csv","w",newline="") as f:
writer = csv.writer(f)
try:
for elem in get_records(url):
print(elem)
except TypeError:
delete_file=True
if delete_file:
os.remove("mutual_fund.csv")
如果您保持现有逻辑不变,并在csv中的内容为空时删除该文件,则以下操作应有效:
import os
import csv
import requests
from bs4 import BeautifulSoup
# url = "https://finance.yahoo.com/quote/fb/holders?p=FB"
url = "https://finance.yahoo.com/quote/UBER/holders?p=UBER"
def get_mutual_fund(soup):
datalist = []
for items in soup.select_one("h3:contains('Top Mutual Fund Holders')").find_next_sibling().select("table tr"):
data = [item.text for item in items.select("th,td")]
datalist.append(data)
return datalist
def get_records(link):
r = requests.get(link)
soup_obj = BeautifulSoup(r.text,"lxml")
try:
item_one = get_mutual_fund(soup_obj)
except AttributeError:
item_one = ""
if item_one:
writer.writerows(item_one)
else:
f.close()
os.remove('mutual_fund.csv')
if __name__ == '__main__':
with open("mutual_fund.csv","w",newline="") as f:
writer = csv.writer(f)
get_records(url)
已终止正在访问csv文件的任何进程,然后重试。或者,如果您正在从Python中读取,请关闭打开的文件。我想你问了一个问题。你不应该使用global
writer
变量从get\u records
函数中写入。它应该返回记录(如果有的话),然后才打开文件进行写作。哦,是的,我很傻,@buran的建议是正确的。访问csv的进程正是全局写入程序。写入文件时不能删除该文件。@yadavanklit,如果要立即删除该文件(如果文件中有内容),则写入该文件的目的是什么?:-)@buran:这个怎么样?从函数内部编写OP的整个想法违反了封装。他们需要重新思考如何检索数据以及如何写入文件。其他一切(即,适应他们解决此问题的方法的变通方法)都是浪费时间