#文件操作使用内置函数 :
open ( name [, mode [, buffering ] ] ) #打开文件
关于open 模式:
w 以写方式打开, a 以追加模式打开 r+ 以读写模式打开 w+ 以读写模式打开 a+ 以读写模式打开 rb 以二进制读模式打开 wb 以二进制写模式打开 ab 以二进制追加模式打开 rb+ 以二进制读写模式打开 wb+ 以二进制读写模式打开 ab+ 以二进制读写模式打开
读写文件方法:
import os #导入os库
# os.mknod("test.txt") #创建空文件
# f = open("test.txt",'w') #直接打开一个文件,如果文件不存在则创建文件model默认为‘r’只读
# f.read([size]) #size为读取的长度,以byte为单位
# f.readline([size]) #读一行,如果定义了size,有可能返回的只是一行的一部分
# f.readlines([size])
#把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()
#来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
# f.write(str) #把str写到文件中,write()并不会在str后加上一个换行符
# f.writelines(seq)
#把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上
#任何东西。
# f.close()
#关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己
#关闭的习惯。 如果一个文件在关闭后还对其进行操作会产生ValueError
# f.flush() #把缓冲区的内容写入硬盘
# f.tell() #返回文件操作标记的当前位置,以文件的开头为原点
# f.next()
#返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,
#就是调用next()函数来实现遍历的。
# f.seek(offset[,whence])
#将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。
#但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计
#算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,
#文件操作标记会自动返回到文件末尾。
# -----------------------语法结构-----------------------------
#常用语法结构为:
with open('gaofei.txt','w+') as fw: #使用with open自动关闭文件
fw.write()
考试例题-及代码
#------------------------考试例题-及代码---------------------------
"""
(一)随机mtDNA序列(50分)
(1).使用代码随机生成20000个样本的mtDNA序列(mtDNA是由AGCT四个字母随机组成的),生成文件名为dnaData.txt,文件的具体格式如下[20分]:
S00001 AGCT….CTAG
S00002 TTAG….AGCT
S00003 ATAG….AGAT
S00004 ATAG….ACTT
……………………………………………….
S20000 ATAG….TGAT
评分标准:
①样本编号必须连续,且从S00001到S20000(5分)
②样本的mtDNA序列的长度必须为20(5分)
③每个位置的氨基酸(A、G、C、T)必须随机生成(5分)
④按照格式将数据存入文件(5分)
(2) 编写一个函数,该函数有两个输入,一个为前面产生的dnData.txt样本文件,一个是某一个样本
的编号(假定该样本的编号一定存在于dnData.txt中,例如S00003 ATAGAGTAATAGTGTAAGAT);函数输出
一个文件,文件名为searchResult.txt。 searchResult.txt的格式和dnData.txt的格式基本一致,但是最后附加相似度数据项;
searchResult.txt样本数据的顺序需要按着和输入样本的相似度降序排序:(输入样本应该出现在第一行)
[30分]。
例:S00001 AGCTACGTACTTATAGCTAG
S00002 TTAGACGTAGTTATAGAGCT
S00003 ATAGAGTAATAGTGTAAGAT
两个mtDNA序列的相似度为:两个序列中字母相同的个数。
样本S00002与样本S00001的相似度为11
样本S00003与样本S00002的相似度为8
①正确生成searchResult.txt文件(7分)
②searchResult.txt文件中的第一行应为输入样本(5分)
③searchResult.txt文件中应存在20000条样本(5分)
④searchResult.txt文件中,先后按照降序排列(8分)
⑤求出并输出所有相似度的平均数(5分)
(二)文件操作(30分)
①创建空文件,并命名为success.txt(5分)
②打开文件success.txt,并写入“Diligence is the path to the mountain of knowledge”(5分)
③用两个不同的打开方法读显示success.txt文件中的内容。(10分)
④使用with打开success.txt文件,向此文件继续写入“Hard-working is the boat to the endless sea
of learning.”。(5分)
⑤使用with打开success.txt文件,读取并输出文件内容到屏幕(5分)
"""
# -----------------------------代 码---------------------------------------
# title1----------------------------------------------------------
import random
#生成每一行的序列
def xulie():
str = ''
# mtDNA序列的长度必须为20
for i in range(20):
if i == 10:
#间隔2个空格
str += ' '
#每个位置的氨基酸(A、G、C、T)必须随机生成
str += random.choice('ACGT')
return str
#格式化数据
list_dna = [ 'S%05d'%(j+1) + ' ' + xulie() + '\n' for j in range(10000)]
# 数据存入文件
with open('dnasamples.txt','w') as f:
f.writelines(list_dna)
#title2------------------------------------------------
#统计和选择的字符串相同的字符的数量,除去空格的两个
def count(old,new):
count = 0
length = len(old)
for i in range(length):
if old[i] == new[i]:
count += 1
return 20-(count - 2)
def search_diff(file , nums):
#读取数据
with open(file,'r') as fr:
list_all = fr.readlines()
dict_all = dict([(line[:6],line[10:-1]) for line in list_all])
#获取数据
str_old = dict_all[nums]
#删除要删除的一行数据
dict_all.pop(nums)
dict_output = [ (k + ' ' + v + ' 区别度为:' , count(str_old,v)) for k,v in dict_all.items()]
#排序:区别程度升序排列(从小到大)
dict_output = sorted(dict_output,key = lambda x : x[1],reverse=False)
print(dict_all) #测试
print(dict_output) #测试
dict_outputs = [ line[0] + str(line[1]) + '\n' for line in dict_output]
print(dict_outputs) #测试
#difference.txt文件
with open('difference.txt' , 'w',encoding='utf-8') as fw:
#ifference.txt文件中的第一行应为输入样本,对应的区别程度为 0
fw.write(nums + ' ' + str_old + ' 区别度为:0\n')
fw.writelines(dict_outputs)
#
search_diff('dnasamples.txt','S00001')