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
这里主要说几个问题:
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 循环得到的是整型存入列表的,而逐行读取的染色体号是字符串型,如果不转换,直接判断就会发现都不在列表中。
所以需要转换,但是只能是把整型转成字符串型
因为染色体号还有其他非数字型的字符串,转整型会报错的。
作者:天秤座的机器狗
链接:https://www.jianshu.com/p/575f43cdf476