本程序 功能:
将tcga数据的批量txt文件合并成一个txt
原始的第一个txt(代表一个病人)的数据内容
合并之后的txt数据,基因名不变,只是把病人的表达量收集到一起
操作说明:
本人测试通过的运行环境:Python 2.7 Windows 7 64bit cmd命令运行器
使用步骤:
1.将要处理的数据txt文件放入到11这个文件夹下面(默认的root = 'C:\\tcga\\datapro\\11'),或者将单引号' '中的路径改成自己txt所在的文件夹的路径(结尾没有\\)也行
2.放入的txt文件建议不要超过100个,因为个数越多,读入时消耗电脑内存就越大,容易卡机,测试时100个可以正常运行
3.默认生成的txt路径为F:/data1.txt,自己也可以修改这个路径和文件名
4.点Windows键,在搜索栏输入 cmd 按回车键,cmd将被打开
4.将tcga_txt.py文件复制到安装的Python所在的文件夹下,我的是C:\Python27(默认安装就是这个路径),能看到python.exe
5.在cmd中输入cd C:\Python27(注意有空格)按回车会进入到该目录,然后输入python.exe tcga_txt.py 再按回车,就开始执行程序了,可以看到写入到输出文件的基因行数
4.处理完第一批txt后,记得将生成的data1.txt改名或者的剪切到别的地方,防止第二批txt运行时生成的data1.txt将其覆盖掉
源码:
tcga_txt.py
# -*- coding:utf-8 -*- """ Author:Logen Version=1.0 Email:iin729@163.com 测试的运行环境:Python 2.7 Windows 7 64bit 使用说明: 1.将要处理的数据txt文件放入到11这个文件夹下面(默认的root = 'C:\\tcga\\datapro\\11'),或者将''中的路径改成自己txt所在的文件夹的路径也行 2.放入的txt文件建议不要超过100个,因为个数越多,读入时消耗电脑内存就越大,容易卡机,测试时100个可以正常运行 3.默认生成的txt路径为F:/data1.txt,自己也可以修改这个路径和文件名 4.处理完第一批txt后,记得将生成的data1.txt改名或者的剪切到别的地方,防止第二批txt运行时生成的data1.txt将其覆盖掉 """ #当编写的Python文件即当前代码及注释中含有中文或者非英文字符时,需要声明编码格式为utf-8 import os #读取txt文件所需要的包 import linecache #读取指定行函数linecache.getline(file_ob, line_num)所在的包 root = 'C:\\tcga\\datapro\\11'#读取的批量txt所在的文件夹的路径 file_names = os.listdir(root) #读取11文件夹下所有的(520个)txt的文件名 file_ob_list = [] #定义一个列表,用来存放刚才读取的520个txt文件名 for file_name in file_names: #循环地给这520个文件名加上它前面的路径,以得到它的具体路径 fileob = root + '\\' + file_name #文件夹路径加上\\ 再加上具体要读的的txt的文件名就定位到了这个txt file_ob_list.append(fileob) #将路径追加到列表中存储 ['C:\\tcga\\datapro\\11\\1.txt','C:\\tcga\\datapro\\11\\2.txt',。。。。] print file_ob_list #打印这个列表的内容到显示屏,不想显示的话可以去掉这句 ldata=[] data = [] #file_ob_list是所有文件(比如10个txt)对象组成的列表,for用来循环读取每一个文件,读取一个文件的方式是一行行读入, # 每次循环一次for就读取所有文件的某一行,因为这一行的第一列都是基因名称,都是一样的 line_num = 1 #从txt的第一行开始读入 total_line = len(open(file_ob_list[0]).readlines()) #计算一个txt中有多少行 while line_num <= total_line: #只有读完的行数小于等于总行数时才再读下一行,否则结束读取 for file_ob in file_ob_list: #按顺序循环读取所有文件 line = linecache.getline(file_ob, line_num)#读取这个文件的第line_num行 line = line.strip() #去掉这一行最后一个字符/n 即换行符 if line is None or len(line) ==0 : break fields = line.split('\t') #将这一行划分为两列,存放到列表中,fields是这样的: ['ENSG00000242268.2','0.0'] prob = fields[1] # fields[0]是'ENSG00000242268.2' fields[1]是'0.0' #这个if部分只是将表达量的10位小数点压缩到4位,其实可以去掉这个处理 if fields[1] != 'NA': #基因表达量不是NA也就是为数字时,才对它进行小数点的减少处理 prob = float(fields[1]) #将字符形式的数字如'0.0'强制转化为浮点型(带小数点的数字)数字0.0 prob = '%.4f' % prob #只保留小数点后面的4位小数 if file_ob == file_ob_list[0] : #如果读的是第一个txt文件,则将读进去的第一列基因名和第二列表达量 data = [fields[0], prob] # 都加入到列表中 data= ['ENSG00000242268.2','0.0'] else : # 如果读进去的不是第一个文件,则跳到else执行,第一列不要, data.append(prob) #只将第二列表达量追加到之前的二维数组后面,假如这时读的是第二个文件的第一行 # 此时fields为['ENSG00000242268.2','0.10'],则data=['ENSG00000242268.2','0.0','0.10'] line_num = line_num + 1 #行数加1,好接着读取每一个文件的第二行 ldata.append(data) #将存放了所有txt的第一行数据的data,放到一个新的列表中保存,这时ldata就是一个二维列表,ldata=[['ENSG00000242268.2','0.0','0.10'],[...],...] #用来存放所有的(60482行,就是所有的基因名)行数 data=[] #清空data用来存放所有txt的下一行 f = open("F:/data1.txt", "w+") #创建存放数据的文件 for i,p in enumerate(ldata): #将数据写入文件,i是enumerate()函数返回的ldata的某个元素p(就是一行数据,如['ENSG00000242268.2','0.0','0.10']从第一个开始)开始的序号(0,1,2等) for j,q in enumerate(p): #读取p(如['ENSG00000242268.2','0.0','0.10'])中的每一个元素 f.write(q + "\t" ) #将这个元素写到txt中,每写一个加入一个“\t”(它代表excel中的一根竖线) print i #显示一下打印到了第多少行 f.write( "\n") #每写完一行,就写入一个换行符"\n",好使的接下来的数据写入到第二行 f.close() #操作完一个文件后应该将它关闭