Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法有条件地删除某些csv文件_Python_Python 3.x_Csv_Web Scraping - Fatal编程技术网

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

我用python编写了一个脚本,从网页中获取一些表格内容,并将其写入csv文件。我现在想做的是,仅当表格(显示为
顶级共同基金持有人
)在该页面中可用时,才允许我的脚本将内容写入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的整个想法违反了封装。他们需要重新思考如何检索数据以及如何写入文件。其他一切(即,适应他们解决此问题的方法的变通方法)都是浪费时间