file.write()比较慢,如何优化?
时间: 2024-05-23 10:11:48 浏览: 11
文件操作的瓶颈通常在磁盘I/O上,因此优化文件写入的速度可以通过以下几个方法:
1. 批量写入:尽量减少写入文件的次数,可以将需要写入的数据先缓存到内存中,等到达一定量或者一定时间后再一次性写入文件。
2. 使用缓冲区:使用缓冲区可以减少磁盘I/O的次数,提高文件写入速度。Python中,可以使用`io.BufferedWriter`类或者`codecs.getwriter`方法来实现缓冲区写入。
3. 使用多线程/多进程:可以开启多个线程或进程,同时写入文件,提高写入速度。但是需要注意并发写入可能会导致文件内容混乱,需要进行同步控制。
4. 使用操作系统缓存:操作系统会对文件进行缓存,如果需要写入的数据较小,可以使用操作系统缓存来提高写入速度。可以使用`os.sync`方法来将缓存中的数据写入磁盘。
总之,优化文件写入速度需要综合考虑数据量大小、磁盘I/O速度、系统资源等因素,选择合适的方法进行优化。
相关问题
rm: remove write-protected regular file 'chirplan-gateway/.git/objects/pack/pack-22b2b2a4a4f560d9db77ee79c1d20a011681d617.idx'?
在Linux系统中,当尝试删除一个被保护的文件时,会提示是否删除该文件。错误提示"rm: remove write-protected regular file"表示要删除的文件受到保护,需要确认操作是否正确。
如果确认要删除该文件,可以使用sudo命令来提升权限,例如:
```
sudo rm chirplan-gateway/.git/objects/pack/pack-22b2b2a4a4f560d9db77ee79c1d20a011681d617.idx
```
该命令会使用sudo权限来执行rm命令,以删除该文件。需要注意的是,执行删除操作前需要确认文件是否可以被删除,以免误删重要文件。
import requests from bs4 import BeautifulSoup import openpyxl from time import sleep # 设置请求头,模拟浏览器访问 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'} # 从天眼查获取公司邮箱和电话 def get_info(company): email = '' phone = '' url = 'https://www.tianyancha.com/search?key=' + company r = requests.get(url, headers=headers) soup = BeautifulSoup(r.text, 'html.parser') # try: # 获取公司详情页链接 company_url = soup.find_all('a', class_='index_alink__zcia5 link-click')[0].get('href') r = requests.get(company_url, headers=headers) soup = BeautifulSoup(r.text, 'html.parser') # 获取公司邮箱和电话 email = soup.find_all('span', class_='index_detail-email__B_1Tq')[0].text sleep(0.5) phone = soup.find('span',class_='index_detail-tel__fgpsE').text # except: # pass # return email,phone # 从Excel文件中读取公司名称 def read_from_excel(file_path): wb = openpyxl.load_workbook(file_path) ws = wb.active company_list = [] for row in ws.iter_rows(min_row=2, values_only=True): company_list.append(row[0]) return company_list # 将公司邮箱和电话写入Excel文件 def write_to_excel(company_list): wb = openpyxl.Workbook() ws = wb.active ws.title = 'Company Info' # 写入表头 ws.cell(row=1, column=1, value='Company Name') ws.cell(row=1, column=2, value='Email') ws.cell(row=1, column=3, value='Phone') # 写入数据 for i, company in enumerate(company_list): email,phone = get_info(company) ws.cell(row=i+2, column=1, value=company) ws.cell(row=i+2, column=2, value=email) ws.cell(row=i+2, column=3, value=phone) # 保存Excel文件 wb.save('company_info.xlsx') if __name__ == '__main__': file_path = 'company_names.xlsx' company_list = read_from_excel(file_path) write_to_excel(company_list)优化这段代码
这段代码可以进行以下优化:
1. 在函数 get_info 中,使用 try...except 捕获异常会使代码难以维护。可以使用 if...else 判断 soup.find_all() 和 soup.find() 是否返回了有效结果,如果无效则将 email 和 phone 赋值为空字符串。
2. 在函数 write_to_excel 中,每次调用 get_info() 都会发起一个 http 请求,这会导致程序运行速度变慢。可以先将所有公司的详情页链接获取到,再一次性请求,减少 http 请求的次数。
下面是优化后的代码:
```
import requests
from bs4 import BeautifulSoup
import openpyxl
from time import sleep
# 设置请求头,模拟浏览器访问
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
# 从天眼查获取公司邮箱和电话
def get_info(company, company_urls):
email = ''
phone = ''
url = 'https://www.tianyancha.com/search?key=' + company
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'html.parser')
# 获取公司详情页链接
company_url = soup.find_all('a', class_='index_alink__zcia5 link-click')
if company_url:
company_urls.append(company_url[0].get('href'))
# 获取公司邮箱和电话
if company_urls:
r = requests.get(company_urls[-1], headers=headers)
soup = BeautifulSoup(r.text, 'html.parser')
email = soup.find('span', class_='index_detail-email__B_1Tq')
phone = soup.find('span', class_='index_detail-tel__fgpsE')
if email:
email = email.text
if phone:
phone = phone.text
sleep(0.5)
return email, phone
# 从Excel文件中读取公司名称
def read_from_excel(file_path):
wb = openpyxl.load_workbook(file_path)
ws = wb.active
company_list = []
for row in ws.iter_rows(min_row=2, values_only=True):
company_list.append(row[0])
return company_list
# 将公司邮箱和电话写入Excel文件
def write_to_excel(company_list):
company_urls = []
for company in company_list:
email, phone = get_info(company, company_urls)
company_urls.pop()
row_num = len(company_urls) + 2
ws.cell(row=row_num, column=1, value=company)
ws.cell(row=row_num, column=2, value=email)
ws.cell(row=row_num, column=3, value=phone)
# 保存Excel文件
wb.save('company_info.xlsx')
if __name__ == '__main__':
file_path = 'company_names.xlsx'
company_list = read_from_excel(file_path)
wb = openpyxl.Workbook()
ws = wb.active
ws.title = 'Company Info'
# 写入表头
ws.cell(row=1, column=1, value='Company Name')
ws.cell(row=1, column=2, value='Email')
ws.cell(row=1, column=3, value='Phone')
write_to_excel(company_list)
```
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)