生信编程实战第11题(python)

题目来自生信技能树论坛

image.png

题目不难,先给出代码

import sys
args=sys.argv
filename=args[1]
aList=[]
for i in range(1,23):
  i=str(i)     #这个转换特别重要,如果不换,存到列表中的将是数字,不是字符串
  aList.append(i)

with open(filename) as fh:
  for line in fh:
     if line.startswith("#"):
         continue
     lineL=line.strip().split("\t")
     chr_num=lineL[0]            #当然这里也是可以考虑转成int,上面的不用转str,但是!!,并不是所有的chr_num都是数字形式的str,所以不能转int,会报错
     if chr_num in aList:
        name=chr_num+".txt"
        f=open(name,"a")     #a很重要,表示写入文件,如果文件存在,则在结尾追加
        f.write(line)    #写入文件
        f.close()   #文件关闭
     else :
        name="else_chr.txt"
        f=open(name,"a")
        f.write(line)
        f.close()

python3 dis.py CCDS.current.txt
image.png

这里主要说几个问题:

  1. python中写入文件可以用的模式如下:
    f=open(filename,"a")
    f.write(content)
    f.close()
    其中a很重要,表示“写入,如果文件有内容,则在末尾追加写入”
    这样就可以保证,无论染色体的顺序怎么排序,只要提取染色体号作为文件名,那么,相同的染色体那一行都会写入同一个文件,因为文件存过一次后,相同的染色体的行可以在该文件结尾追加。

这里就顺便把open函数的其他mode了解一下:
'rt'为默认方式
'r' open for reading (default)——只读,默认方式
'w' open for writing, truncating the file first——写入,会覆盖源文件内容
'x' create a new file and open it for writing——创建新文件,并写入内容,如果文件已存在,将会报错:FileExistsError
'a' open for writing, appending to the end of the file if it exists——写入,如果文件有内容,则在末尾追加写入
'b' binary mode——二进制模式
't' text mode (default)——文本模式
'+' open a disk file for updating (reading and writing)——更新磁盘文件,读写
'U' universal newline mode (deprecated)——在python3中已经弃用

2.因为题目要求是1~22号染色体分别存入文件,其他的存入同一个文件
所以我的想法是创建一个1~22数字的存入一个列表,每次都判断染色体号在不在列表,在就分别存,不在就存到一个共同的else的文件。
这个思路没有问题,但是,关键在于
我用for 循环得到的是整型存入列表的,而逐行读取的染色体号是字符串型,如果不转换,直接判断就会发现都不在列表中。
所以需要转换,但是只能是把整型转成字符串型
因为染色体号还有其他非数字型的字符串,转整型会报错的。

你可能感兴趣的:(生信编程实战第11题(python))