如何使用Python在文本文件中用分号替换空格?

时间:2015-05-10 16:38:14

标签: python whitespace

我有一个包含许多分隔值的大文本文件。但是文本文件具有由空格和分号分隔的值。下面是使用Less命令在Unix中的某些行的样子:

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT
chr7    149601  MERGED_DEL_2_39754      T       .       141.35  .   AC=0;AF=0.00;AN=2;DP=37;MQ=37.00;MQ0=0;1000gALT=<DEL>;AF1000g=0.09
chr7    149616  rs190051229     C       .       108.65  .       AC=0;AF=0.00;AN=2;DP=35;MQ=37.00;MQ0=0;1000gALT=T;AF1000g=0.00
chr7    149628  rs3814456       A       .       129.31  .       AC=0;AF=0.00;AN=2;DP=37;MQ=37.00;MQ0=0;1000gALT=G;AF1000g=0.14
chr7    149634  rs146001818     G       T       1375.63 .       AC=2;AF=1.00;AN=2;BaseQRankSum=0.456;DP=39;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.9997;MQ=37.00;MQ0=0;MQRankSum=1.641;QD=35.27;ReadPosRankSum=1.459;1000gALT=T;AF1000g=0.01

我希望能够用分号替换chr7旁边的空白区域。然后我想在POS值中选择一定范围内的行,例如:149601到149628(前三行),所以我可以计算此范围内AF100g的总值(在这个例子中前三行是0.24) )。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

我不太明白你的意思&#34;相差30或更少&#34;。因为第1行(149601)和第2行(149616)的差异为15,所以它已经小于30了。

现在获取所需的值(假设您正在迭代文件并将每一行存储在名为line的变量中):

POS:我建议先用一个空格替换所有空格,然后用这个空格将字符串分成几部分(line = re.sub(r" +", r" ", line))。第二个元素将是您的POS值(pos = int(line.split(" ")[1]))。

AF值:只需使用正则表达式搜索关键字:float(re.match(r".*?AF1000g=(.*?)\s.*?", line).groups()[0])

保留一个全局变量,在每个循环步骤中累加各个AF值。达到所需条件时打印添加的AF值。继续将先前的POS值保存在循环外的变量中,并取两个pos值之间的差值。如果您想要正值,请务必使用abs()