我有一个看起来如此的文件:
#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}
是,
分割文件的最佳方法,并尝试找出从其余列中减去第一个值的方法,即使这些行的长度不同?
答案 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分割,然后用','分割数组中的每个字符串。 如果不是,你应该尝试在每一列之间放一个特殊的字符,这样你就可以用它来分割。