Python实现读取多个/批量txt文件合并成一个txt(示例为tcga数据处理)

时间:2022-10-29 17:22:10

本程序 功能:

将tcga数据的批量txt文件合并成一个txt

原始的第一个txt(代表一个病人)的数据内容

 Python实现读取多个/批量txt文件合并成一个txt(示例为tcga数据处理)

合并之后的txt数据,基因名不变,只是把病人的表达量收集到一起

 Python实现读取多个/批量txt文件合并成一个txt(示例为tcga数据处理)

 

操作说明:

本人测试通过的运行环境:Python 2.7  Windows 7 64bit  cmd命令运行器

使用步骤:

        1.将要处理的数据txt文件放入到11这个文件夹下面(默认的root = 'C:\\tcga\\datapro\\11'),或者将单引号' '中的路径改成自己txt所在的文件夹的路径(结尾没有\\也行

 Python实现读取多个/批量txt文件合并成一个txt(示例为tcga数据处理)

        2.放入的txt文件建议不要超过100个,因为个数越多,读入时消耗电脑内存就越大,容易卡机,测试时100个可以正常运行

        3.默认生成的txt路径为F:/data1.txt,自己也可以修改这个路径和文件名

 Python实现读取多个/批量txt文件合并成一个txt(示例为tcga数据处理)

        4.Windows键,在搜索栏输入 cmd 按回车键,cmd将被打开

Python实现读取多个/批量txt文件合并成一个txt(示例为tcga数据处理) 

        4.tcga_txt.py文件复制到安装的Python所在的文件夹下,我的是C:\Python27(默认安装就是这个路径),能看到python.exe

 Python实现读取多个/批量txt文件合并成一个txt(示例为tcga数据处理)

Python实现读取多个/批量txt文件合并成一个txt(示例为tcga数据处理)

        5.cmd中输入cd C:\Python27(注意有空格)按回车会进入到该目录,然后输入python.exe tcga_txt.py  再按回车,就开始执行程序了,可以看到写入到输出文件的基因行数

Python实现读取多个/批量txt文件合并成一个txt(示例为tcga数据处理)


        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()  #操作完一个文件后应该将它关闭