Python学习教程(二)
输入输出
交互式输入输出
在很多时候,你会想要让你的程序与用户(可能是你自己)交互。你会从用户那里得到输入,然后打印一些结果。我们可以分别使用raw_input和print语句来完成这些功能。
a = raw_input("Please input a string\n> ")
print "The string you typed in is: ", a
Please input a string
> a
The string you typed in is: a
print "这是一个保留例子,仅供玩耍\n"
lucky_num = 5
c = 0
while True:
b = int(raw_input("Please input a number to check if you are \
lucky enough to guess right: \n"))
if b == lucky_num:
print "\nYour are so smart!!! ^_^ ^_^"
#----------------------------------------------------
#--------------------------------------------------------
else:
print "\nSorry, but you are not right. %>_<%"
while 1:
c = raw_input("Do you want to try again? [Y/N] \n")
if c == 'Y':
try_again = 1
break
elif c == 'N':
try_again = 0
break
else:
print "I can not understand you, please check your input. \n"
continue
#----------------------------------------------------
if try_again:
print "\nHere comes another run. Enjoy!\n"
continue
else:
print "\nBye-bye\n"
break
这是一个保留例子,仅供玩耍
Please input a number to check if you are lucky enough to guess right:
5
Your are so smart!!! ^_^ ^_^
Please input a number to check if you are lucky enough to guess right:
7
Sorry, but you are not right. %>_<%
Do you want to try again? [Y/N]
Y
Here comes another run. Enjoy!
Please input a number to check if you are lucky enough to guess right:
8
Sorry, but you are not right. %>_<%
Do you want to try again? [Y/N]
N
Bye-bye
文件读写
文件读写是最常见的输入和输出操作。你可以实用file
或open
来实现。
print "新建一个文件"
context = '''The best way to learn python contains two steps:
1. Rember basic things mentionded here masterly.
2. Practise with real demands.
'''
print "以写入模式(w)打开一个文件并命名为(Test_file.txt)"
fh = open("Test_file.txt","w")
print >>fh, context
#fh.write(context)
fh.close() #文件操作完成后必须关闭文件句柄
新建一个文件
以写入模式(w)打开一个文件并命名为(Test_file.txt)
print "以只读模式(r)读入一个名为(Test_file.txt)的文件"
print
for line in open("Test_file.txt"):
print line
以只读模式(r)读入一个名为(Test_file.txt)的文件
The best way to learn python contains two steps:
1. Rember basic things mentionded here masterly.
2. Practise with real demands.
print '''避免中间空行的输出。
从文件中读取的每一行都带有一个换行符,
而Python的print默认会在输出结束时加上换行符,
因此打印一行会空出一行。为了解决这个问题,有下面两套方案。'''
print "在print语句后加上逗号(,)可以阻止Python对每次输出自动添加的换行符"
print
for line in open("Test_file.txt"):
print line,
print
print "去掉每行自身的换行符"
for line in open("Test_file.txt"):
print line.strip()
避免中间空行的输出。
从文件中读取的每一行都带有一个换行符,
而Python的print默认会在输出结束时加上换行符,
因此打印一行会空出一行。为了解决这个问题,有下面两套方案。
在print语句后加上逗号(,)可以阻止Python对每次输出自动添加的换行符
The best way to learn python contains two steps:
1. Rember basic things mentionded here masterly.
2. Practise with real demands.
去掉每行自身的换行符
The best way to learn python contains two steps:
1. Rember basic things mentionded here masterly.
2. Practise with real demands.
实战练习(一)
背景知识
1. FASTA文件格式
>seq_name_1
sequence1
>seq_name_2
sequence2
2. FASTQ文件格式
@HWI-ST1223:80:D1FMTACXX:2:1101:1243:2213 1:N:0:AGTCAA
TCTGTGTAGCCNTGGCTGTCCTGGAACTCACTTTGTAGACCAGGCTGGCATGCA
+
BCCFFFFFFHH#4AFHIJJJJJJJJJJJJJJJJJIJIJJJJJGHIJJJJJJJJJ
作业 (一)
给定FASTA格式的文件(test1.fa 和 test2.fa),写一个程序
cat.py
读入文件,并输出到屏幕
open(file)
for .. in loop
print
the amazng , or strip() function
用到的知识点
给定FASTQ格式的文件(test1.fq), 写一个程序 cat.py
读入文件,并输出到屏幕
同上
用到的知识点
写程序 splitName.py
, 读入test2.fa, 并取原始序列名字第一个空格前的名字为处理后的序列名字,输出到屏幕
split
字符串的索引
用到的知识点
输出格式为:
>NM_001011874 gcggcggcgggcgagcgggcgctggagtaggagctg.......
写程序 formatFasta.py
, 读入test2.fa,把每条FASTA序列连成一行然后输出
join
strip
用到的知识点
输出格式为:
>NM_001011874 gcggcggcgggc......TCCGCTG......GCGTTCACC......CGGGGTCCGGAG
写程序 formatFasta-2.py
, 读入test2.fa,把每条FASTA序列分割成80个字母一行的序列
字符串切片操作
range
用到的知识点
输出格式为
>NM_001011874 gcggcggcgc.(60个字母).TCCGCTGACG #(每行80个字母) acgtgctacg.(60个字母).GCGTTCACCC ACGTACGATG(最后一行可不足80个字母)
写程序 sortFasta.py
, 读入test2.fa, 并取原始序列名字第一个空格前的名字为处理后的序列名字,排序后输出
sort
dict
aDict[key] = []
aDict[key].append(value)
用到的知识点
提取给定名字的序列
用到的知识点
print >>fh, or fh.write()
取模运算,4 % 2 == 0
写程序
grepFasta.py
, 提取fasta.name中名字对应的test2.fa的序列,并输出到屏幕。写程序
grepFastq.py
, 提取fastq.name中名字对应的test1.fq的序列,并输出到文件。
写程序 screenResult.py
, 筛选test.expr中foldChange大于2的基因并且padj小于0.05的基,可以输出整行或只输出基因名字
逻辑与操作符 and
文件中读取的内容都为字符串,需要用int转换为整数,float转换为浮点数
用到的知识点
写程序 transferMultipleColumToMatrix.py
将文件(multipleColExpr.txt)中基因在多个组织中的表达数据转换为矩阵形式
aDict[‘key’] = {}
aDict[‘key’][‘key2’] = value
if key not in aDict
aDict = {‘ENSG00000000003’: {“A-431”: 21.3, “A-549”, 32.5,…},”ENSG00000000003”:{},}
用到的知识点
输入格式(只需要前3列就可以)
Gene Sample Value Unit Abundance ENSG00000000003 A-431 21.3 FPKM Medium ENSG00000000003 A-549 32.5 FPKM Medium ENSG00000000003 AN3-CA 38.2 FPKM Medium ENSG00000000003 BEWO 31.4 FPKM Medium ENSG00000000003 CACO-2 63.9 FPKM High ENSG00000000005 A-431 0.0 FPKM Not detected ENSG00000000005 A-549 0.0 FPKM Not detected ENSG00000000005 AN3-CA 0.0 FPKM Not detected ENSG00000000005 BEWO 0.0 FPKM Not detected ENSG00000000005 CACO-2 0.0 FPKM Not detected
输出格式
Name A-431 A-549 AN3-CA BEWO CACO-2 ENSG00000000460 25.2 14.2 10.6 24.4 14.2 ENSG00000000938 0.0 0.0 0.0 0.0 0.0 ENSG00000001084 19.1 155.1 24.4 12.6 23.5 ENSG00000000457 2.8 3.4 3.8 5.8 2.9
写程序 reverseComplementary.py
计算序列 ACGTACGTACGTCACGTCAGCTAGAC
的反向互补序列
reverse
list(seq)
用到的知识点
写程序 collapsemiRNAreads.py
转换smRNA-Seq的测序数据
输入文件格式(mir.collapse, tab-分割的两列文件,第一列为序列,第二列为序列被测到的次数)
ID_REF VALUE ACTGCCCTAAGTGCTCCTTCTGGC 2 ATAAGGTGCATCTAGTGCAGATA 25 TGAGGTAGTAGTTTGTGCTGTTT 100 TCCTACGAGTTGCATGGATTC 4
输出文件格式 (mir.collapse.fa, 名字的前3个字母为样品的特异标示,中间的数字表示第几条序列,是序列名字的唯一标示,第三部分是x加每个reads被测到的次数。三部分用下划线连起来作为fasta序列的名字。)
>ESB_1_x2 ACTGCCCTAAGTGCTCCTTCTGGC >ESB_2_x25 ATAAGGTGCATCTAGTGCAGATA >ESB_3_x100 TGAGGTAGTAGTTTGTGCTGTTT >ESB_4_x4 TCCTACGAGTTGCATGGATTC
简化的短序列匹配程序 (map.py) 把short.fa中的序列比对到ref.fa, 输出短序列匹配到ref.fa文件中哪些序列的哪些位置
find
用到的知识点
输出格式 (输出格式为bed格式,第一列为匹配到的染色体,第二列和第三列为匹配到染色体序列的起始终止位置(位置标记以0为起始,代表第一个位置;终止位置不包含在内,第一个例子中所示序列的位置是(199,208](前闭后开,实际是chr1染色体第199-206的序列,0起始). 第4列为短序列自身的序列.)。
附加要求:可以只匹配到给定的模板链,也可以考虑匹配到模板链的互补链。这时第5列可以为短序列的名字,第六列为链的信息,匹配到模板链为’+’,匹配到互补链为’-‘。注意匹配到互补链时起始位置也是从模板链的5’端算起的。
chr1 199 208 TGGCGTTCA chr1 207 216 ACCCCGCTG chr2 63 70 AAATTGC chr3 0 7 AATAAAT
备注:
每个提到提到的“用到的知识点”为相对于前面的题目新增的知识点,请综合考虑。此外,对于不同的思路并不是所有提到的知识点都会用着,而且也可能会用到未提到的知识点。但是所有知识点都在前面的讲义部分有介绍。
每个程序对于你身边会写的人来说都很简单,因此你一定要克制住,独立去把答案做出,多看错误提示,多比对程序输出结果和预期结果的差异。
学习锻炼“读程序”,即对着文件模拟整个的读入、处理过程来发现可能的逻辑问题。
程序运行没有错误不代表你写的程序完成了你的需求,你要去查验输出结果是不是你想要的。
关于程序调试
在初写程序时,可能会出现各种各样的错误,常见的有缩进不一致,变量名字拼写错误,丢失冒号,文件名未加引号等,这时要根据错误提示查看错误类型是什么,出错的是哪一行来定位错误。当然,有的时候报错的行自身不一定有错,可能是其前面或后面的行出现了错误。
用脑袋运行程序:当程序写作完成后,自己尝试对着数据文件,一行一行的执行程序,来看程序的运行是否与自己想干的活一致,有没有纰漏。
当结果不符合预期时,要学会使用print来查看每步的操作是否正确,比如我读入了字典,我就打印下字典,看看读入的是不是我想要的,是否含有不该存在的字符;或者在每个判断句、函数调入的情况下打印个字符,来跟踪程序的运行轨迹。