aboutsummaryrefslogtreecommitdiff
path: root/r_qtl/r_qtl2.py
diff options
context:
space:
mode:
Diffstat (limited to 'r_qtl/r_qtl2.py')
-rw-r--r--r_qtl/r_qtl2.py33
1 files changed, 28 insertions, 5 deletions
diff --git a/r_qtl/r_qtl2.py b/r_qtl/r_qtl2.py
index 9da4081..c6307f5 100644
--- a/r_qtl/r_qtl2.py
+++ b/r_qtl/r_qtl2.py
@@ -18,6 +18,10 @@ FILE_TYPES = (
"geno", "founder_geno", "pheno", "covar", "phenocovar", "gmap", "pmap",
"phenose")
+__CONTROL_FILE_ERROR_MESSAGE__ = (
+ "The zipped bundle that was provided does not contain a valid control file "
+ "in either JSON or YAML format.")
+
def __special_file__(filename):
"""
@@ -72,6 +76,8 @@ def transpose_csv(
def __read_by_line__(_path):
with open(_path, "r", encoding="utf8") as infile:
for line in infile:
+ if line.startswith("#"):
+ continue
yield line
transposed_data= (f"{linejoinerfn(items)}\n" for items in zip(*(
@@ -112,7 +118,7 @@ def __control_data_from_zipfile__(zfile: ZipFile) -> dict:
or filename.endswith(".json"))))
num_files = len(files)
if num_files == 0:
- raise InvalidFormat("Expected a json or yaml control file.")
+ raise InvalidFormat(__CONTROL_FILE_ERROR_MESSAGE__)
if num_files > 1:
raise InvalidFormat("Found more than one possible control file.")
@@ -129,7 +135,6 @@ def __control_data_from_zipfile__(zfile: ZipFile) -> dict:
else yaml.safe_load(zfile.read(files[0])))
}
-
def __control_data_from_dirpath__(dirpath: Path):
"""Load control data from a given directory path."""
files = tuple(path for path in dirpath.iterdir()
@@ -137,7 +142,7 @@ def __control_data_from_dirpath__(dirpath: Path):
and (path.suffix in (".yaml", ".json"))))
num_files = len(files)
if num_files == 0:
- raise InvalidFormat("Expected a json or yaml control file.")
+ raise InvalidFormat(__CONTROL_FILE_ERROR_MESSAGE__)
if num_files > 1:
raise InvalidFormat("Found more than one possible control file.")
@@ -200,8 +205,8 @@ def control_data(control_src: Union[Path, ZipFile]) -> dict:
if control_src.is_dir():
return __cleanup__(__control_data_from_dirpath__(control_src))
raise InvalidFormat(
- "Expects either a zipfile.ZipFile object or a pathlib.Path object "
- "pointing to a directory containing the R/qtl2 bundle.")
+ "Expects either a zipped bundle of files or a path-like object "
+ "pointing to the zipped R/qtl2 bundle.")
def replace_na_strings(cdata, val):
@@ -549,3 +554,21 @@ def load_samples(zipfilepath: Union[str, Path],
pass
return tuple(samples)
+
+
+
+def read_text_file(filepath: Union[str, Path]) -> Iterator[str]:
+ """Read the raw text from a text file."""
+ with open(filepath, "r", encoding="utf8") as _file:
+ for line in _file:
+ yield line
+
+
+def read_csv_file(filepath: Union[str, Path],
+ separator: str = ",",
+ comment_char: str = "#") -> Iterator[tuple[str, ...]]:
+ """Read a file as a csv file."""
+ for line in read_text_file(filepath):
+ if line.startswith(comment_char):
+ continue
+ yield tuple(field.strip() for field in line.split(separator))