鱼C论坛

 找回密码
 立即注册
查看: 1855|回复: 10

[已解决]Python 提取指定文件夹下的文件名到表格,并根据文件名提取文件中内容到对应文件名...

[复制链接]
发表于 2019-10-18 20:57:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Dawnstar 于 2019-10-19 09:50 编辑

想请教各位大神,我想提取指定文件夹下的文件名到表格,并根据文件名提取文件中内容到对应文件名下。我现在处理的是一批txt格式的物种蛋白文件,我想提取每个文件的名称到表格的第一行,并将文件中的蛋白名称提取出来。
文件夹里的内容如下:
>YP_006908651.1 putative inhibitor of apoptosis protein [Abalone herpesvirus Victoria/AUS/2009]
MKIDKPTSIVESVLEVTQRITPKERPSIGIDVFSSMYVQAVSMSAVNAWHSAGPDEGGYLVLRDKDSPDRKLAEVELPYAKEEDRLESFSPYWNFEPSSEELAKAGFYYTGKSDRVKCFSCALEISEWGGEEGESPMEIHQRETKKEHGLMYDCAFLSVACKTVPDAVDSTTDNGTYAGRLESYGRFEWPKQSHMKPEELAAAGLYYTGRGDRVACHFCGQILRTWERGDVAMIEHARWAENRNCPYLKYTAGNAVRGISRLENPIYN
>YP_006908652.1 hypothetical protein AbHV_ORF2_1 [Abalone herpesvirus Victoria/AUS/2009]
MCEVRKGKGKVRKTTRGQGEIAGAFTTKSSNDSPKGINEQESLARDHSCLDEEARNTMKRSHDQTDMSSSDSRVKIPHLADHDYCLPPEEERQLDVIYMEDDCQAHEEVHYDENVSAEDLHSEIERLRAERALTLSENETLRAELERLRADNEKKLNDETAALPELEDKKNGFANSFIANIHSELGLEMMNTPAGKVYKEMCLAVHDENVIAEDEGREPRSVMIPLTVDVMKELEFDFKDNKATNQQRDRKLKNIQCDDVMKYQPMKNGSKDAANSTIEKFIQTNNIFSMREMIHDKNTNNIPLLTIDQFMRYIITGITQQNHDIRKDVSRIMAKIHTASDRQQYKVFKNLYSDWLRQEEQIKTLSLANALLEKEKENERLRADNQTLRADAQEKRAVKAEFNEVMFHSPTDRRVYVNKVFPNRNKKVGANLIVRSLMTPRDNEKEMNKLVGPKKWSPLFCSQPLPEATSVRDVLVKKGLQNDKLVGINRAIAYNAWTGEQKRWMSEMKQPQHQLPGGKSCGENWFRYHPVDTHDVEKIKKSFSHYARQECEKIKRDIFT
>YP_006908653.1 putative eukaryotic translation initiation factor [Abalone herpesvirus Victoria/AUS/2009]
MEINVHPHVNTTAYRHKMPEIETRIEGGSLTKLVNVRAVAKALNRKKEHIVKFLGCVLGVGVCAQNNLIGGSVSRMKVQELIDVYIANFVLCDRCTSPETVLLSGSGNPVLRCGACGYIGRVLGEEEMIKDMVDDEW
>YP_006908654.1 hypothetical protein AbHV_ORF4 [Abalone herpesvirus Victoria/AUS/2009]
MASTSSSNVNLKRSLESEGGERGGVKKMKVARMDCRPGKVMRFTCKPVEKRDQAVRELSEKLGSAARIIAGNDDGVVVVKFEERFQKARDFLDGFDWMLEDEAELNRWFEIDSNEKLYDDDVMKLSDDIEPIKIDEDVHRLLNYLYSVKGMQTEFKGKSKTYFLFTLNNLIKLKLIESKGENAERTLKRIGDIDPNNFKLYKYGELFGLRHLPNMPHTFIFNRLDYKPMGEIAVAVRSGHICKALSNFKTETARKLGDVMAMVFEKVITKVAEDHVKEVGMETFVETVVRPTLEGALPEAIDSRLELLDAESKIMELKAETVHERMLRLKAEAEAVKFDGLRIQAEEASRESKLLAIESQINEIKAQEETRVALFDKRQAELGEERIRLEKEKEANKFKLERIIERPNQDLTHQGDRRRREGVVWIQRTHLSSAEEKRKKPVYKQNGEVSTEPLHYTLYRSEHEEKSETLRQTRDLVKKYVKKSSYTMERLTPSLVLYGGNNVEETKKLFKQTFKARGGRLLMTVAEEAEFDQKIREKIVPFVKQSYALGLHNGTLAFCNEAILKSLPVEDEAFCMEIIGEM
>YP_006908655.1 hypothetical protein AbHV_ORF5 [Abalone herpesvirus Victoria/AUS/2009]
MDEFDFSDWFEDVGSYVEPMDTDSFLEEVCGLSLPTPVQPPPPPPPTQDLSFGDSFLEEVCGTSVTQPKDDEVNKMIQELSSIFEDEPPSPPKEPPPRYFSYDDKVSLLDNVKAASKFHRYSRNGHYFVSHRHRLAHDPWSEHIASQLYTRCMQRGNNHHVVSEVIFDKEKRRWEHGRVKNDDEDLVNDEGDVIEDPITRAEKHPMRFDEENDTSDEVSAPVMTFDKIKVMTAPYSDAFMAKLNTANSLDGCETHKIKRIRTATGEMREVMKVNPSFPVHKTKFGPVPATRVAYKRADYTANYNAYALEKPNNCNINGTRGTHEFIIVNRINEAHCQLNNPHGKMYTILDMDCENNNSITIDSGLNGTIAMSYKSKICRKQNEKGQKRKREDLDDDDDLGGGNEDGECRKEFVLVQKAEYGTHKTTIMTKKKRFNLKKGLVGDVTKETKNEFMMAKLKAQREEVMNACCGAREIQVHAHCFNCSALGGYEIIDPVQNLACKIFEDEKILVSIAANNIKGMSMVMSNSLSSSIVNNFFDLLCWKFKVHRGTEEEQDRFYKRVLKPIAQKMDISRYNYAQAGIFCHSILKTSPMFSQHHLNLVSQKFNNPRATEVFKKACVVDDVATRMNDKWNSKRPLATVNVKSKPTPSRVKYAATMSRGPSVPDLWYNASEKVRGFIESYFGPLDESER
>YP_006908656.1 hypothetical protein AbHV_ORF6 [Abalone herpesvirus Victoria/AUS/2009]
MKRSPRSGNLNLFFNQSPKNEFEENIDEKVIVETNVEEVVETNVSEVVETNVSEEVVETNVSEKLEDQKVAAAVDESLDVKPLMIVPEPPKLSLEERLKIFKERPIMKLSHFLRVNKGVDYNRHRHCYWAVRTCVICTAPCDIKEYAVTLCCDLPVCHSCSFISGYAYARKSKPTSNCCRICTNGGMNISLNYIDFILSEHSHQKTFTSQFLEGVGAADNMQLHKMVTGLEAIHNNYEGVGDDDVFLPNTVPIKPPRKTITL
>YP_006908657.1 hypothetical protein AbHV_ORF7 [Abalone herpesvirus Victoria/AUS/2009]
MSNQFDPRLKAGQTFSVVSAVNLMLTEWHSIKQIIDLIASSHLTKSLFSSMSQLQNCLEELLNVKSKLAEDYAGFIVPFTNQDNTVISVCLRYSYKVCLTSVDRLISALQLVDGLNERSSVNFTRDMLVIKRSGLLASDIPHRIYTDLCMEKHLARLSPTNDRPSAKVLNHVNPMSEFYEVPSLEVVYGSNPTLTKLIDDCVLLASYPIISPNVGGELITTHGFDTYVPLKLNESGPDSRSQVETPFDSRVCVICKLDNLAIGYTDVIEQHKRLICKCVFIREAPSTLYMDVATHTQATMRVRERLIRDRESMTETEKRLFYNSFDKYASAIASTKIHNK
>YP_006908658.1 hypothetical protein AbHV_ORF8 [Abalone herpesvirus Victoria/AUS/2009]
MMKIDFDEAESRANIDSEISRQCVQRIKSQMKRERRTKPTPREQRILNRELRNYDLATDRANSYATKNDMRHAMNRRSEQTSEQYHFHKECAQSFRLQRLKLILLRKEKKAVKQIDKLLHEEDKGDDDYDFNSRIEEYSSQCTSALGDRDIMTSKSSKDYIRQHELMLDEEEEEEDIPFMPAPPSSSLTSSSRAPSPLSETLLQKFTDFSLCRTNSTPASKQGKHSQS
>YP_006908659.1 hypothetical protein AbHV_ORF9 [Abalone herpesvirus Victoria/AUS/2009]
MDDKSSGMQAAALATEDDDDGVSSLVDMINSGALSLEVERQMKRDGERNLLFYQEVMSATFDRDLLRSKIFPEDASKGPCMRMKQSLYKEASKPIVGEYAFESDPVFSSASTAHLRLVEKSKILSKDIPEIVLDYNQDPSVISVDESNMIVTDVHHPQENQTRIFFQLDNGYVLSIPTVNPWSERIYRYTITSVPQDKELLVYDNLEDVFKNYPNYAEKLFTNAPDDDDDDEEGGPEQYLKLDRSFLGVSGVSDGSDLEVVARYHIPMELNPLQYVMHKPNLYLFTGKDQEGNNNCLYALNTELVEGEGKPWIAPWTKVKIYDSETYVDLTDPNTLTVFEDEVPSYRLTIEVSEGSNIGVLSVPDYPTYDIPSLTLIEEVNDIVLEAAEEEDDED
>YP_006908660.1 hypothetical protein AbHV_ORF10 [Abalone herpesvirus Victoria/AUS/2009]
MSTNEETPSSSSSVARAAACMPDDLSSIDKDSLIKLGVETSSKILEACSIKYAPLSFGEILNGNNPERRKMFSLEGKRGQRSLKHITQHTLKDNDEIIESLNEICTHFINQQIISEHPELEDSVRELNFKNVLEPGRVIKIEDHRMGSYQIKDPCFNLYPSRVCFLEPYKRACGGSMSEVYKELKSLLERECNMGAGCLYRRMFPQCKRAGRVALPESVEYVFTKLLPACSNEGGATGLVHTLHAQFFSFAEECGKKKVQSVYKVRQQCIVCTMLKLSKETNKNAGLDRPHMDLYNEEDENIFLTKTEDLKDFGVIEVSRPDYNDMVVNVHGQKKVMVVDRSKLFSNIDMCEEDGFFFPVIMTEGRDVVPTNLPTSRKRRGGGGGGKKGAKRMLLDEI
>YP_006908661.1 hypothetical protein AbHV_ORF11 [Abalone herpesvirus Victoria/AUS/2009]
MYKFLRVYEILLLGTIVSAVDFALYKNDMKTGRMTVYCQKQKQAGENRLFYDTDVYEDDTLLYDGWSTSKKGNFGVNTICGDRDYQLPAGQMVSNSFNVRPQERNTICLSAEAQCENYQKFTFVGRSSFFKCETPECEARNLLGDKYVSPFISLDGVPNNTLVEFKENVIMAPVDYSMMDRWNGIGTKNAMQHFMSQIYYGIKFYNKVKVVTFSSPGTLPTKGEKFLLVYRQTEDCEPPNGGFSKVGEPCDGPFTFYYVQRSPDYPTDFEITERHLCGRTVTFTLFFDIRAVDNRSKFYFLPHEFKNENFDFNKNISYNSTTKCGLTGVKKASIVKRELMNHFASFCPERQKDAGG

举个例子:现在有三个文件夹Abaca bunchy top viru,Abalone herpesvirus Victoria_AUS_200,Acanthochromis_polyacanthus.ASM210954v1.pep.al,我想得到的结果是:
   
  
  Abaca bunchy top viru
  
  Abalone herpesvirus Victoria_AUS_200
  
  Acanthochromis_polyacanthus.ASM210954v1.pep.al
  
  >YP_001661660.1 putative replicase protein
  
  >YP_006908768.1 hypothetical protein AbHV_ORF59_2  
  
  >ENSAPOP00000034950.1
  
   
  
  >YP_001661660.1 putative replicase protein
  
  >YP_006908768.1 hypothetical protein AbHV_ORF59_2  
  
  >ENSAPOP00000034950.1
  
   
  
  >YP_001661660.1  putative replicase protein
  
  >YP_006908768.1 hypothetical protein AbHV_ORF59_2  
  
  >ENSAPOP00000034950.1
  
                                                                                                   


我写的代码如下:
  1. import os

  2. files = os.listdir(path)  #遍历文件夹下的所有文件名称
  3. text = 'Protein name'
  4. file1 = open (path + text, 'w')
  5. print(file = file1,end="\t")
  6. file_name = []
  7. for file in files:
  8.     if '.fa'in os.path.splitext(file)[1]:  #获取所有含‘.fa’的文件
  9.         file_name.append(file[:-3]) #去掉.fa后缀,获取文件名
  10. for each in file_name:
  11.     print(each, file = file1, end="\t")
  12. print(file = file1)
  13. for file in files:
  14.     if '.fa'in os.path.splitext(file)[1]:  #获取所有含‘.fa’的文件
  15.         fa_path = path + file
  16.         content = open(fa_path, 'r')  #读文档内的内容
  17.         j = {}      #将文件名建一个字典
  18.         for s in file_name:
  19.             j[s] = 0
  20.         for seq in content:                    
  21.             if '>' in seq:
  22.                 for species in file_name:
  23.                     j[species] = seq
  24.             else:
  25.                 del seq
  26.         for a in file_name:
  27.             print(j[a], file = file1, end = "\t")
  28.         print(file = file1)
  29. file1.close()
复制代码
[/code]

但我的代码得到的结果是:
   
  
  Abaca bunchy top viru
  
  Abalone herpesvirus Victoria_AUS_200
  
  Acanthochromis_polyacanthus.ASM210954v1.pep.al
  
  >YP_001661660.1 putative replicase protein
  
   
  
   
  
   
  
   
  
  >YP_001661660.1 putative replicase protein
  
   
  
   
  
   
  
  >YP_001661660.1  putative replicase protein
  
   
  
   
  
   
  
   
  
   
  
   
  
  >YP_006908768.1 hypothetical protein AbHV_ORF59_2  
  
   
  
   
  
   
  
   
  
  >YP_006908768.1 hypothetical protein AbHV_ORF59_2  
  
   
  
   
  
   
  
  >YP_006908768.1 hypothetical protein AbHV_ORF59_2  
  
   
  
   
  
   
  
   
  
   
  
   
  
  >ENSAPOP00000034950.1
  
   
  
   
  
   
  
   
  
  >ENSAPOP00000034950.1
  
   
  
   
  
   
  
  >ENSAPOP00000034950.1
  
   
  
   
  

修改了好久,总是修改不好,望大神指点一下。

最佳答案
2019-10-21 11:57:07
你的描述真的很烂。
这是我自以为理解了,所写的代码
  1. import os


  2. def get_fileContent(fa_path):
  3.     content = []
  4.     with open(fa_path, 'r') as f:
  5.         for line in f:
  6.             if '>YP_' in line:
  7.                 content.append(line.split()[0])

  8.     return content

  9. def get_ListItemMaxLen(lList):
  10.     MaxLen = 0
  11.     for content in lList:
  12.         nLen = len(content)
  13.         if nLen > MaxLen:
  14.             MaxLen = nLen

  15.     return MaxLen



  16. path = r'D:\Users\Administrator\Desktop\新建文件夹'
  17. filesContent = []

  18. #遍历文件夹下的所有文件名称
  19. for fpathe,dirs,fs in os.walk(path):
  20.     for f in fs:
  21.         FileName, Ext = os.path.splitext(f)
  22.         
  23.         #获取所有含‘.fa’的文件
  24.         if Ext == '.fa':
  25.             fa_path = os.path.join(fpathe,f)
  26.             content = get_fileContent(fa_path)
  27.             content.insert(0, FileName)            
  28.             filesContent.append(content)
  29.             

  30. MaxLen = get_ListItemMaxLen(filesContent)

  31. for i in range(0, MaxLen):
  32.     FilesLen = len(filesContent)
  33.     for j in range(0, FilesLen):
  34.         if i == 0:
  35.             sp ='\t\t\t'
  36.         else:
  37.             sp = '\t\t\t\t\t'
  38.         try:
  39.             print(filesContent[j][i],end = sp)
  40.             if j == FilesLen - 1:
  41.                 print()
  42.         except:
  43.             print()
  44.             break
  45.         

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-18 21:36:04 | 显示全部楼层
你的题意描述的不够情楚
相关文件请上传
表格?excel? 你要得到什么样的效果请上图。

可以的话,奖励总得有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-19 09:53:11 | 显示全部楼层
ba21 发表于 2019-10-18 21:36
你的题意描述的不够情楚
相关文件请上传
表格?excel? 你要得到什么样的效果请上图。

谢谢版主提醒,已经对内容进一步修改,可能因级别不高,暂时无法上传高清图片,奖励的话,不知道在哪里设置。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-19 19:13:03 | 显示全部楼层
你还是没说什么表格啊。
是打印出这样的效果就可以了?还是要存为excel表格?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-21 08:11:27 | 显示全部楼层
ba21 发表于 2019-10-19 19:13
你还是没说什么表格啊。
是打印出这样的效果就可以了?还是要存为excel表格?

这种效果就可以,我保存的是txt格式。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-21 11:57:07 | 显示全部楼层    本楼为最佳答案   
你的描述真的很烂。
这是我自以为理解了,所写的代码
  1. import os


  2. def get_fileContent(fa_path):
  3.     content = []
  4.     with open(fa_path, 'r') as f:
  5.         for line in f:
  6.             if '>YP_' in line:
  7.                 content.append(line.split()[0])

  8.     return content

  9. def get_ListItemMaxLen(lList):
  10.     MaxLen = 0
  11.     for content in lList:
  12.         nLen = len(content)
  13.         if nLen > MaxLen:
  14.             MaxLen = nLen

  15.     return MaxLen



  16. path = r'D:\Users\Administrator\Desktop\新建文件夹'
  17. filesContent = []

  18. #遍历文件夹下的所有文件名称
  19. for fpathe,dirs,fs in os.walk(path):
  20.     for f in fs:
  21.         FileName, Ext = os.path.splitext(f)
  22.         
  23.         #获取所有含‘.fa’的文件
  24.         if Ext == '.fa':
  25.             fa_path = os.path.join(fpathe,f)
  26.             content = get_fileContent(fa_path)
  27.             content.insert(0, FileName)            
  28.             filesContent.append(content)
  29.             

  30. MaxLen = get_ListItemMaxLen(filesContent)

  31. for i in range(0, MaxLen):
  32.     FilesLen = len(filesContent)
  33.     for j in range(0, FilesLen):
  34.         if i == 0:
  35.             sp ='\t\t\t'
  36.         else:
  37.             sp = '\t\t\t\t\t'
  38.         try:
  39.             print(filesContent[j][i],end = sp)
  40.             if j == FilesLen - 1:
  41.                 print()
  42.         except:
  43.             print()
  44.             break
  45.         

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-22 09:19:22 | 显示全部楼层
ba21 发表于 2019-10-21 11:57
你的描述真的很烂。
这是我自以为理解了,所写的代码

谢谢回复,抱歉描述的不清楚。我试一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-22 13:46:36 | 显示全部楼层
从楼主贴出的代码的打印顺序来看,嗯,是有可能做出:文件名在第一列,与文件名在同一行的是相应的以 '>' 开头的东西 这样的表。
如果要达到楼主期望的格式,也许要增加一个变量来储存数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-22 13:48:33 | 显示全部楼层
Dawnstar 发表于 2019-10-19 09:53
谢谢版主提醒,已经对内容进一步修改,可能因级别不高,暂时无法上传高清图片,奖励的话,不知道在哪里设 ...

奖励这种东西,还有另一种名称:悬赏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-22 20:47:17 | 显示全部楼层
阴阳神万物主 发表于 2019-10-22 13:46
从楼主贴出的代码的打印顺序来看,嗯,是有可能做出:文件名在第一列,与文件名在同一行的是相应的以 '>'  ...

谢谢回复。我再验证试试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-22 20:48:15 | 显示全部楼层
阴阳神万物主 发表于 2019-10-22 13:48
奖励这种东西,还有另一种名称:悬赏

小白一枚,还要多学习,下次发帖,发悬赏帖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 14:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表