Source code for openpnm.io._csv

import re

import numpy as np
from pandas import read_csv

from openpnm.io import _parse_filename
from openpnm.io._pandas import network_to_pandas, project_to_pandas
from openpnm.utils import Project


[docs] def project_to_csv(project, filename=''): r""" Save all the pore and throat data on the Network and Phase objects to a CSV file Parameters ---------- project : list An openpnm ``project`` object filename : str or path object The name of the file to store the data """ df = project_to_pandas(project=project, join=True, delim='.') if filename == '': filename = project.name fname = _parse_filename(filename=filename, ext='csv') df.to_csv(fname, index=False)
[docs] def network_to_csv(network, filename=''): """Exports a network to a CSV file.""" proj = Project() proj.append(network) df = network_to_pandas(network=network, join=True, delim='.') if filename == '': filename = network.name fname = _parse_filename(filename=filename, ext='csv') df.to_csv(fname, index=False)
[docs] def network_from_csv(filename): """Loads a network from a CSV file.""" from openpnm.network import Network fname = _parse_filename(filename=filename, ext='csv') a = read_csv(filepath_or_buffer=fname, sep=',', skipinitialspace=True, header=0, low_memory=False) # First parse through all the items and re-merge columns dct = {} keys = sorted(list(a.keys())) for item in keys: m = re.search(r'\[.\]', item) # The dot '.' is a wildcard if m: # m is None if pattern not found, otherwise merge cols pname = re.split(r'\[.\]', item)[0] # Get base propname # Find all other keys with same base propname merge_keys = [k for k in a.keys() if k.startswith(pname)] # Rerieve and remove arrays with same base propname merge_cols = [a.pop(k) for k in merge_keys] # Merge arrays into multi-column array and store in DataFrame dct[pname] = np.vstack(merge_cols).T # Remove key from list of keys for k in keys: if k.startswith(pname): keys.pop(keys.index(k)) else: dct[item] = np.array(a.pop(item)) # Now scan through 'pore.coords' and 'throat.conns' to get Np and Nt, # then remove the nans try: Np = np.where(np.isnan(dct['pore.coords'][:, 0]))[0][0] except IndexError: Np = dct['pore.coords'][:, 0].shape[0] try: Nt = np.where(np.isnan(dct['throat.conns'][:, 0]))[0][0] except IndexError: Nt = dct['throat.conns'][:, 0].shape[0] for k, v in dct.items(): if k.startswith('pore.'): dct[k] = v[:Np, ...] if k.startswith('throat.'): dct[k] = v[:Nt, ...] # This is a fix for pandas loading in all data types as dtype('O') # if it encounters mixed types in the file. For whatever reason # the conversion to type 'float64' works without problem, however for # boolean values, the dtype 'O' persists. That can lead to difficult # to debug errors later on. Therefore here this fix: for k, v in dct.items(): if type(v[0]) is bool: dct[k] = v.astype(bool) network = Network() network.update(dct) return network