重新初始化文件中的数字(具有不同的列数?)

时间:2015-06-18 14:27:55

标签: python

我有一个看起来如此的文件:

#name   chrom   exonStarts  exonEnds
NM_005101   chr1    948846,949363,  948956,949919,
NM_198576   chr1    955502,957580,970656,976044,976552,976857,977335,978618,978917,979202,979488,979713,980540,980738,981112,981343,981539,981776,982199,982706,982952,983155,983391,984246,984615,984945,985282,985612,985806,986105,986632,986832,987107,989132,989827,990203,    955753,957842,970704,976260,976777,977082,977542,978837,979112,979403,979637,979819,980657,980903,981256,981468,981645,982115,982337,982834,983067,983275,983745,984439,984831,985175,985417,985709,985971,986217,986749,987025,987195,989357,989931,991499,
NM_003327   chr1    1146705,1147083,1147321,1148017,1148371,1149042,1149362,    1147005,1147212,1147518,1148084,1148473,1149165,1149548,

我想要做的是从该值的其余数字中减去第3列中的第一个数字。例如,这就是我希望我的输出为第一行:

NM_005101   chr1    1,110,    517,1073,

我最初决定将文件拆分为,,但这导致每行的列数不同,这使得它很难。我的最终目标是以某种方式找出一种方法将这些值添加到字典中,其名称为键,值(exonStart和exonEnds)为范围列表,因此我可以从第二个文件中测试,如果某个值是在给定名称和位置的特定范围内。

我最后一本字典的例子:

posdic = {name:[[start, end], [start, end]], name: etc} 

,分割文件的最佳方法,并尝试找出从其余列中减去第一个值的方法,即使这些行的长度不同?

2 个答案:

答案 0 :(得分:1)

这是一个以您指定的格式处理一行的函数:

def read_exons(line):
    parts = iter(line.split())
    name = next(parts)
    chrom = next(parts)
    starts = map(int, next(parts).strip(',').split(','))
    ends = map(int, next(parts).strip(',').split(','))
    base = starts[0]
    return name, [(s-base, e-base) for s, e in zip(starts, ends)]

它返回一个包含名称和开始/结束对列表的元组:

>>> read_exons('NM_005101   chr1    948846,949363,  948956,949919,')
('NM_005101', [(0, 110), (517, 1073)])

您可以按如下方式处理整个文件。请注意,dict构造函数采用一系列元组(由read_exons返回),以用作键/值对:

>>> with open('input.txt') as f: # use the real filename
...     exons = dict(read_exons(line) for line in f
...                  if not line.strip().startswith('#'))
>>> exons.keys()
['NM_005101', 'NM_198576', 'NM_003327']

答案 1 :(得分:0)

如果你总是在exonStarts和exonEnds之间有空格char,你可以用空格char分割,然后用','分割数组中的每个字符串。 如果不是,你应该尝试在每一列之间放一个特殊的字符,这样你就可以用它来分割。