我在windows上,想运行我的多线程python应用程序,以异步方式将数据保存到.csv。正如报告的here、here和here,我在某个时刻得到了以下错误:
Traceback (most recent call last):
File "results_path", line 422, in function
df_results.to_csv(results_file)
IOError: [Errno 24] Too many open files
This建议对每个文件IO操作包括with语句的修复:
^{pr2}$
但是,我仍然得到上面描述的IOError(简而言之,所有这些问题都没有解决我的问题)。因此,with-语句显然不能在append操作后正确关闭.csv文件。在
首先,我现在增加打开文件的数量。诚然,这只是推迟了坠机时间:import win32file
max_open_files = 2048 # Windows-specific threshold for max. open file count
win32file._setmaxstdio(max_open_files)
其次,我的临时方法是(A)连续检查打开的.csv文件,(B)如果打开的文件数接近windows允许的阈值,则强制重新启动整个脚本:from psutil import Process
import os, sys
proc = Process()
open_file_count = 0 # Set up count of open files
for open_file in proc.open_files(): # Iterate open files list
if ".csv" in str(open_file): # Is file of .csv type?
open_file_count += 1 # Count one up
else:
continue
else:
if open_file_count > (max_open_files / 2): # Threshold, see above
os.execl(sys.executable, sys.executable, *sys.argv) # Force restart
else:
pass
这种方法在很多方面都是丑陋和低效的(在每个迭代/线程中遍历所有打开的文件)。至少,这需要在不强制重新启动整个代码的情况下工作。在
Q1:如何在windows上使用python正确关闭.csv文件?
Q2:如果IO操作后关闭失败,如何一次强制关闭打开的所有.csv文件?