@@ -313,7 +313,7 @@ def read_gtf_full(f, as_df=False, nrows=None, skiprows=0, duplicate_attr=False):
313313
314314 names = "Chromosome Source Feature Start End Score Strand Frame Attribute" .split (
315315 )
316- # names = "Chromosome Start End Score Strand Source Feature Frame Attribute".split()
316+
317317 df_iter = pd .read_csv (
318318 f ,
319319 sep = "\t " ,
@@ -352,8 +352,14 @@ def to_rows(anno):
352352 raise Exception ("Invalid attribute string: {l}. If the file is in GFF3 format, use pr.read_gff3 instead." .format (l = l ))
353353
354354 for l in anno :
355- l = l .replace ('"' , '' ).replace (";" , "" ).split ()
356- rowdicts .append ({k : v for k , v in zip (* ([iter (l )] * 2 ))})
355+ rowdicts .append ({k : v
356+ for k , v in [kv .replace ('"' , '' ).split (None , 1 )
357+ # l[:-1] removes final ";" cheaply
358+ for kv in l [:- 1 ].split ("; " )]})
359+
360+ # for l in anno:
361+ # l = l.replace('"', '').replace(";", "").split()
362+ # rowdicts.append({k: v for k, v in zip(*([iter(l)] * 2))})
357363
358364 return pd .DataFrame .from_dict (rowdicts ).set_index (anno .index )
359365
@@ -362,8 +368,10 @@ def to_rows_keep_duplicates(anno):
362368 rowdicts = []
363369 for l in anno :
364370 rowdict = {}
365- l = l .replace ('"' , '' ).replace (";" , "" ).split ()
366- for k , v in zip (* ([iter (l )] * 2 )):
371+
372+ # l[:-1] removes final ";" cheaply
373+ for k , v in (kv .replace ('"' , '' ).split (None , 1 ) for kv in l [:- 1 ].split ("; " )):
374+
367375 if k not in rowdict :
368376 rowdict [k ] = v
369377 elif k in rowdict and isinstance (rowdict [k ], list ):
@@ -442,8 +450,6 @@ def read_gtf_restricted(f,
442450def to_rows_gff3 (anno ):
443451 rowdicts = []
444452
445- # anno = anno.str.replace(";$", "")
446-
447453 for l in list (anno ):
448454 l = (it .split ("=" ) for it in l .split (";" ))
449455 rowdicts .append ({k : v for k , v in l })
0 commit comments