题目来自生信技能树论坛
题目不难,先给出代码
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
这里主要说几个问题:
- 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 循环得到的是整型存入列表的,而逐行读取的染色体号是字符串型,如果不转换,直接判断就会发现都不在列表中。
所以需要转换,但是只能是把整型转成字符串型
因为染色体号还有其他非数字型的字符串,转整型会报错的。
网友评论