Skip to content

Commit

Permalink
Merge pull request #306 from pyiron/Add_ipynb_file_support
Browse files Browse the repository at this point in the history
Add ipynb file support
  • Loading branch information
niklassiemer authored May 7, 2021
2 parents 23c6130 + 41f5980 commit 79563e3
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 14 deletions.
52 changes: 42 additions & 10 deletions pyiron_base/generic/filedata.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

import pandas

from pyiron_base import ImportAlarm, FileHDFio
from pyiron_base import ImportAlarm, FileHDFio, ProjectHDFio

__author__ = "Niklas Siemer"
__copyright__ = (
Expand All @@ -27,30 +27,53 @@
try:
from PIL import Image
_has_imported['PIL'] = True
import_alarm = ImportAlarm()
# For some reason I do not know this forces PIL to always be aware of all possible Image extensions.
Image.registered_extensions()
except ImportError:
_has_imported['PIL'] = False
try:
import nbformat, nbconvert
_has_imported['nbformat'] = True
except ImportError:
_has_imported['nbformat'] = False

if all(_has_imported.values()):
import_alarm = ImportAlarm()
else:
import_alarm = ImportAlarm(
"Reduced functionality, since " + 'PIL' + " could not be imported."
"Reduced functionality, since " +
str([package for package in _has_imported.keys() if not _has_imported[package]]) +
" could not be imported."
)


if _has_imported['nbformat']:
class OwnNotebookNode(nbformat.NotebookNode):

"""Wrapper for nbformat.NotebookNode with some additional representation based on nbconvert."""
def _repr_html_(self):
html_exporter = nbconvert.HTMLExporter()
html_exporter.template_name = "classic"
(html_output, _) = html_exporter.from_notebook_node(self)
return html_output


@import_alarm
def load_file(filename, filetype=None):
def load_file(filename, filetype=None, project=None):
"""
Load the file and return an appropriate object containing the data.
Args:
filename (str): path to the file to be displayed.
filetype (str/None): File extension, if given this overwrites the assumption based on the filename.
project (pyiron-Project/None): Project calling this function, provided to all objects referring to such.
Supported file types are:
'.h5', '.hdf'
'.json'
'.txt'
'.csv'
'.ipynb'
Image extensions supported by PIL
Returns:
Expand All @@ -64,6 +87,9 @@ def _load_txt(file):
with open(file, encoding='utf8') as f:
return f.readlines()

def _load_ipynb(file):
return OwnNotebookNode(nbformat.read(file, as_version=4))

def _load_json(file):
with open(file) as f:
return json.load(f)
Expand All @@ -84,16 +110,22 @@ def _load_default(file):
_, filetype = os.path.splitext(filename)
elif filetype[0] != '.':
filetype = '.' + filetype
filetype = filetype.lower()

if filetype.lower() in ['.h5', '.hdf']:
return FileHDFio(file_name=filename)
if filetype.lower() in ['.json']:
if filetype in ['.h5', '.hdf']:
if project is None:
return FileHDFio(file_name=filename)
else:
return ProjectHDFio(file_name=filename, project=project)
elif filetype in ['.json']:
return _load_json(filename)
elif filetype.lower() in ['.txt']:
elif filetype in ['.txt']:
return _load_txt(filename)
elif filetype.lower() in ['.csv']:
elif filetype in ['.csv']:
return _load_csv(filename)
elif _has_imported['PIL'] and filetype.lower() in Image.registered_extensions():
elif _has_imported['nbformat'] and filetype in ['.ipynb']:
return _load_ipynb(filename)
elif _has_imported['PIL'] and filetype in Image.registered_extensions():
return _load_img(filename)
else:
return _load_default(filename)
Expand Down
2 changes: 1 addition & 1 deletion pyiron_base/project/generic.py
Original file line number Diff line number Diff line change
Expand Up @@ -1441,7 +1441,7 @@ def _get_item_helper(self, item, convert_to_object=True):
return ProjectHDFio(project=self, file_name=file_name)
if item in self.list_files():
file_name = posixpath.join(self.path, "{}".format(item))
return load_file(file_name)
return load_file(file_name, project=self)
if item in self.list_dirs():
with self.open(item) as new_item:
return new_item.copy()
Expand Down
15 changes: 12 additions & 3 deletions tests/generic/test_filedata.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import unittest
import os
import json
import os
import unittest

import pandas as pd

from pyiron_base import FileHDFio, ProjectHDFio
from pyiron_base.generic.filedata import FileData, load_file
from pyiron_base import FileHDFio
from pyiron_base.project.generic import Project


class TestLoadFile(unittest.TestCase):
Expand Down Expand Up @@ -50,6 +52,13 @@ def test_load_file_hdf(self):
self.assertIsInstance(hdf, FileHDFio)
self.assertEqual(hdf['content/key'], 'value')

def test_load_file_ProjectHDF(self):
pr = Project(self.current_dir + '/test_pr')
pr_hdf = load_file(self.current_dir + '/test_data.h5', project=pr)
self.assertIsInstance(pr_hdf, ProjectHDFio)
self.assertEqual(pr_hdf['content/key'], 'value')
pr.remove(enable=True)

def test_load_file_default(self):
"""Test default load for text file and h5 file without extension."""
filename = self.current_dir + '/test_data'
Expand Down

0 comments on commit 79563e3

Please sign in to comment.