确定从ipython笔记本中读取和写入的所有文件

时间:2017-02-17 02:06:41

标签: python file-io ipython ipython-notebook jupyter-notebook

这是对这个问题的概括:Way to extract pickles coming in and out of ipython / jupyter notebook

在最高级别,我正在寻找一种方法来自动总结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"]

我想知道如何轻松地做到这一点,除了pickle对象,包括不同的格式,如:txt,csv,jpg,png等...还可能涉及直接从网络读取数据到笔记本本身。

1 个答案:

答案 0 :(得分:4)

您可以通过将内置open修补为JRG suggested来检查已打开或修改的文件,并且如果要跟踪,则应扩展此功能以修补用于连接到网站的任何功能那也是。

import builtins


modified = {}
old_open = builtins.open


def new_open(name, mode='r', *args, **kwargs):
    modified[name] = mode
    return old_open(name, mode=mode, *args, **kwargs)


# patch builtin open
builtins.open = new_open


# check modified
def whats_modified():
    print('Session has opened/modified the following files:')
    for name in sorted(modified):
        mode = modified[name]
        print(mode.ljust(8) + name)

我们在解释器中执行它(或将其用作模块),我们可以看到我们修改了什么以及我们如何打开它。

In [4]: with open('ex.txt') as file:
   ...:     print('ex.txt:', file.read())
   ...:     
ex.txt: some text.



In [5]: with open('other.txt', 'w') as file:
   ...:     file.write('Other text.\n')
   ...:     

In [6]: whats_modified()
Session has opened/modified the following files:
r       ex.txt
w       other.txt

但这有点受限,因为重新打开文件时会覆盖模式,但可以通过new_open中执行的一些额外检查来修复。