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.py45
1 files changed, 31 insertions, 14 deletions
diff --git a/r_qtl/r_qtl2.py b/r_qtl/r_qtl2.py
index dfa84ba..0ef487f 100644
--- a/r_qtl/r_qtl2.py
+++ b/r_qtl/r_qtl2.py
@@ -16,7 +16,7 @@ from r_qtl.exceptions import InvalidFormat, MissingFileException
FILE_TYPES = (
"geno", "founder_geno", "pheno", "covar", "phenocovar", "gmap", "pmap",
- "phenose")
+ "phenose", "phenonum")
__CONTROL_FILE_ERROR_MESSAGE__ = (
"The zipped bundle that was provided does not contain a valid control file "
@@ -411,22 +411,19 @@ def file_data(zfile: ZipFile,
try:
if isinstance(cdata[member_key], list):
- for row in (line for lines in
+ yield from (line for lines in
(file_data(
zfile, member_key, {**cdata, member_key: innerfile},
process_value, process_transposed_value)
for innerfile in cdata[member_key])
- for line in lines):
- yield row
+ for line in lines)
return
if not cdata.get(f"{member_key}_transposed", False):
- for row in with_non_transposed(zfile, member_key, cdata, process_value):
- yield row
+ yield from with_non_transposed(zfile, member_key, cdata, process_value)
return
- for row in with_transposed(
- zfile, member_key, cdata, process_transposed_value):
- yield row
+ yield from with_transposed(
+ zfile, member_key, cdata, process_transposed_value)
except KeyError as exc:
raise MissingFileException(*exc.args) from exc
@@ -477,8 +474,7 @@ def raw_file_data(zipfilepath: Union[str, Path],
with (ZipFile(str(zipfilepath), "r") as zfile,
zfile.open(memberfilename) as innerfile):
wrappedfile = io.TextIOWrapper(innerfile)
- for line in wrappedfile:
- yield line
+ yield from wrappedfile
def strip_comments(rawdata: Iterator[str], commentchar) -> Iterator[str]:
"""Remove comments from raw text."""
@@ -568,15 +564,36 @@ def load_samples(zipfilepath: Union[str, Path],
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
+ yield from _file
def read_csv_file(filepath: Union[str, Path],
separator: str = ",",
comment_char: str = "#") -> Iterator[tuple[str, ...]]:
- """Read a file as a csv file."""
+ """Read a file as a csv file. This does not process the N/A values."""
for line in read_text_file(filepath):
if line.startswith(comment_char):
continue
yield tuple(field.strip() for field in line.split(separator))
+
+
+def read_csv_file_headers(
+ filepath: Union[str, Path],
+ transposed: bool,
+ separator: str = ",",
+ comment_char: str = "#"
+) -> tuple[str, ...]:
+ """Read the 'true' headers of a CSV file."""
+ headers = tuple()
+ for line in read_text_file(filepath):
+ if line.startswith(comment_char):
+ continue
+
+ line = tuple(field.strip() for field in line.split(separator))
+ if not transposed:
+ return line
+
+ headers = headers + (line[0],)
+ continue
+
+ return headers