我的申请,我有以下要求:1.有一个线程会定期记录一些日志文件.日志文件将在特定时间间隔内进行翻转.用于保持日志文件较小.2.还有另一个线程也会定期处理这些日志文件.例如:将日志文件移动到其他位置,解析日志的内容以生成一些日志报告.
但是,有一个条件是第二个线程无法处理用于记录日志的日志文件.在代码方面,伪代码类似如下:
#code in second thread to process the log files
for logFile in os.listdir(logFolder):
if not file_is_open(logFile) or file_is_use(logFile):
ProcessLogFile(logFile) # move log file to other place, and generate log report....
Run Code Online (Sandbox Code Playgroud)
那么,我如何检查文件是否已经打开或被其他进程使用?我在互联网上做了一些研究.并有一些结果:
try:
myfile = open(filename, "r+") # or "a+", whatever you need
except IOError:
print "Could not open file! Please close Excel!"
Run Code Online (Sandbox Code Playgroud)
我尝试了这段代码,但无论我使用"r +"还是"a +"标志,它都无效
try:
os.remove(filename) # try to remove it directly
except OSError as e:
if e.errno == errno.ENOENT: # file doesn't exist
break
Run Code Online (Sandbox Code Playgroud)
此代码可以工作,但它无法达到我的请求,因为我不想删除该文件以检查它是否已打开.
我写了一种严重的文件密集型测试套件.过了一段时间(2小时)我得到了一个IOError: [Errno 24] Too many open files: '/tmp/tmpxsqYPm'.我仔细检查了所有文件句柄是否再次关闭它们.但错误仍然存在.
我试图弄清楚使用的允许文件描述符resource.RLIMIT_NOFILE的数量和当前打开的文件解析器的数量:
def get_open_fds():
fds = []
for fd in range(3,resource.RLIMIT_NOFILE):
try:
flags = fcntl.fcntl(fd, fcntl.F_GETFD)
except IOError:
continue
fds.append(fd)
return fds
Run Code Online (Sandbox Code Playgroud)
所以,如果我运行以下测试:
print get_open_fds()
for i in range(0,100):
f = open("/tmp/test_%i" % i, "w")
f.write("test")
print get_open_fds()
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
[]
/tmp/test_0
[3]
/tmp/test_1
[4]
/tmp/test_2
[3]
/tmp/test_3
[4]
/tmp/test_4
[3]
/tmp/test_5
[4] ...
Run Code Online (Sandbox Code Playgroud)
这很奇怪,我预计会有越来越多的打开文件描述符.我的剧本是否正确?
我正在使用python的logger和subprocess.这可能是我的fd泄漏的原因吗?
谢谢,丹尼尔
有时使用ipython时,您可能会在以写入模式打开文件的函数中遇到异常.这意味着下次运行该函数时会出现值错误,
ValueError:文件'filename'已经打开.请在写入模式下重新打开之前关闭它.
但是,由于函数被淘汰,文件句柄(在函数内部创建)将丢失,因此无法关闭.绕过它的唯一方法似乎是关闭ipython会话,此时你会收到消息:
关闭剩余的打开文件:filename ... done
有没有办法指示ipython关闭文件而不退出会话?
要读取文件的内容:
data = open(filename, "r").read()
Run Code Online (Sandbox Code Playgroud)
打开的文件立即停止在任何地方被引用,因此文件对象最终将关闭...并且它不应该影响使用它的其他程序,因为该文件仅用于读取而不是写入.
编辑:这实际上在我写的一个项目中咬了我 - 它促使我问这个问题.只有在内存不足时才清理文件对象,而不是在文件句柄用完时清理.因此,如果您经常这样做,最终可能会耗尽文件描述符并导致IO尝试打开文件以引发异常.
这是对这个问题的概括:提取进出ipython/jupyter笔记本的泡菜的方法
在最高级别,我正在寻找一种方法来自动总结ipython笔记本中发生的事情.我看到的简化问题的一种方法是将笔记本内部的所有数据操作视为黑盒,并仅关注其输入和输出.那么,有没有办法给ipython笔记本提供文件路径如何轻松确定它读入内存的所有不同文件/网站,以及随后写入/转储的所有文件?我想也许可能有一个函数扫描文件,解析输入和输出,并将其保存到字典中以便于访问:
summary_dict = summerize_file_io(ipynb_filepath)
print summary_dict["inputs"]
> ["../Resources/Data/company_orders.csv", "http://special_company.com/company_financials.csv" ]
print summary_dict["outputs"]
> ["orders_histogram.jpg","data_consolidated.pickle"]
Run Code Online (Sandbox Code Playgroud)
我想知道如何轻松地做到这一点,除了pickle对象,包括不同的格式,如:txt,csv,jpg,png等...还可能涉及直接从网络读取数据到笔记本本身.
可能重复:
检查Python中打开的文件
你好,
是否有可能获得所有当前打开的文件句柄的列表,我认为它们存储在环境中的某个位置.
我对theis函数感兴趣,因为我想安全地处理在引发致命错误时打开的任何文件,即关闭文件句柄并用原始文件替换可能已损坏的文件.
我有处理工作,但不知道什么文件句柄是打开的,我无法实现这个想法.
顺便说一句,当初始化文件句柄时,是否可以通过另一个导入的方法继承它?
谢谢
我试过谷歌但找不到答案.
如果我这样做
c = pickle.load(open(fileName, 'r'))
Run Code Online (Sandbox Code Playgroud)
此操作后文件会自动关闭吗?