Pythonの:各チャンクのサイズが未知のときにチャンクでテキストファイルを読みます -- python フィールド 関連 問題

Python : Reading text file in chunks when size of each chunk is unkown












0
vote

問題

日本語
次のように

私はspace.Itによって分割されたブロックとしてデータが含まれている巨大なテキストファイルで作業する必要がありますがあります:

<事前> <コード> >3D_helix;140 protein_name:AChR pore alpha subunit (Torpedo marmorata) file_name:ACh_pore_alpha.txt entry_date:3july03 refman_number:21022 endnote_number: author:Miyazawa,A., Fujiyoshi,Y., Unwin,N.(2003) [Structure and gating mechanism of the acetylcholine receptor pore] {Nature, 423, 949-955} remarks:Sequence is from PDB, chain A. There is additional 24 AA as signal sequence in Swiss-Prot. TMhelices=4. pir_number: Swiss_Prot_entry:ACHA_TORMA Swiss_Prot_number:P02711 Swiss_Prot_gene:CHRNA1 Swiss_Prot_name:Acetylcholine receptor subunit alpha PDB_title:Acetylcholine Receptor Protein, alpha Chain PDB_Identifier:1OED N_terminal:in number_tmsegs:4 tm_segments:A.211,237;B.243,271;C.275,300;D.403,436 sequence:SEHETRLVANLLENYNKVIRPVEHHTHFVDITVGLQLIQLINVDEVNQIVETNVRLRQQWIDVRLRWNPADYGGIKKIRLPSDDVWLPDLVLYNNADGDFAIVHMTKLLLDYTGKIMWTPPAIFKSYCEIIVTHFPFDQQNCTMKLGIWTYDGTKVSISPESDRPDLSTFMESGEWVMKDYRGWKHWVYYTCCPDTPYLDITYHFIMQRIPLYFVVNVIIPCLLFSFLTVLVFYLPTDSGEKMTLSISVLLSLTVFLLVIVELIPSTSSAVPLIGKYMLFTMIFVISSIIVTVVVINTHHRSPSTHTMPQWVRKIFINTIPNVMFFSTMKRASKEKQENKIFADDIDISDISGKQVTGEVIFQTPLIKNPDVKSAIEGVKYIAEHMKSDEESSNAAEEWKYVAMVIDHILLCVFMLICIIGTVSVFAGRLIELSQEG* >1D_helix;141 protein_name:AChR pore beta subunit (Torpedo marmorata) file_name:ACh_pore_beta.txt entry_date:3july03 refman_number:21022 endnote_number: author:Miyazawa,A., Fujiyoshi,Y., Unwin,N.(2003) [Structure and gating mechanism of the acetylcholine receptor pore] {Nature, 423, 949-955} remarks:Sequence is from PDB, chain B. There is additional 24 AA as signal sequence in Swiss-Prot. TMhelices=4. pir_number: Swiss_Prot_entry:Q6S3I0_TORMA Swiss_Prot_number:Q6S3I0 Swiss_Prot_gene:none Swiss_Prot_name:Acetylcholine receptor beta subunit PDB_title:Acetylcholine Receptor Protein, beta Chain PDB_Identifier:1OED N_terminal:in number_tmsegs:4 tm_segments:A.224,241;B.249,274;C.290,306;D.438,462 sequence:SVMEDTLLSVLFENYNPKVRPSQTVGDKVTVRVGLTLTSLLILNEKNEEMTTSVFLNLAWTDYRLQWDPAAYEGIKDLSIPSDDVWQPDIVLMNNNDGSFEITLHVNVLVQHTGAVSWHPSAIYRSSCTIKVMYFPFDWQNCTMVFKSYTYDTSEVILQHALDAKGEREVKEIMINQDAFTENGQWSIEHKPSRKNWRSDDPSYEDVTFYLIIQRKPLFYIVYTIVPCILISILAILVFYLPPDAGEKMSLSISALLALTVFLLLLADKVPETSLSVPIIISYLMFIMILVAFSVILSVVVLNLHHRSPNTHTMPNWIRQIFIETLPPFLWIQRPVTTPSPDSKPTIISRANDEYFIRKPAGDFVCPVDNARVAVQPERLFSEMKWHLNGLTQPVTLPQDLKEAVEAIKYIAEQLESASEFDDLKKDWQYVAMVADRLFLYIFITMCSIGTFSIFLDASHNVPPDNPFA* >3D_other;143 protein_name:AChR pore delta subunit (Torpedo marmorata) file_name:ACh_pore_delta.txt entry_date:4dec03 refman_number:21022 endnote_number: author:Miyazawa,A., Fujiyoshi,Y., Unwin,N.(2003) [Structure and gating mechanism of the acetylcholine receptor pore] {Nature, 423, 949-955} remarks:Sequence is from PDB, chain C. Sequence in PDB has first 21 AA removed relative to Swiss-Prot. TMhelices=4. pir_number: Swiss_Prot_entry:Q6S3H8_TORMA Swiss_Prot_number:Q6S3H8 Swiss_Prot_gene:none Swiss_Prot_name:Acetylcholine receptor delta subunit PDB_title:Acetylcholine Receptor Protein, delta Chain PDB_Identifier:1OED N_terminal:in number_tmsegs:4 tm_segments:A.226,253;B.257,285;C.289,316;D.452,483 sequence:VNEEERLINDLLIVNKYNKHVRPVKHNNEVVNIALSLTLSNLISLKETDETLTTNVWMDHAWYDHRLTWNASEYSDISILRLRPELIWIPDIVLQNNNDGQYNVAYFCNVLVRPNGYVTWLPPAIFRSSCPINVLYFPFDWQNCSLKFTALNYNANEISMDLMTDTIDGKDYPIEWIIIDPEAFTENGEWEIIHKPAKKNIYGDKFPNGTNYQDVTFYLIIRRKPLFYVINFITPCVLISFLAALAFYLPAESGEKMSTAICVLLAQAVFLLLTSQRLPETALAVPLIGKYLMFIMSLVTGVVVNCGIVLNFHFRTPSTHVLSTRVKQIFLEKLPRILHMSRVDEIEQPDWQNDLKLRRSSSVGYISKAQEYFNIKSRSELMFEKQSERHGLVPRVTPRIGFGNNNENIAASDQLHDEIKSGIDSTNYIVKQIKEKNAYDEEVGNWNLVGQTIDRLSMFIITPVMVLGTIFIFVMGNFNRPPAKPFEGDPFDYSSDHPRCA

各ブロックは3つの与えられたオプションのいずれかで始まります。各ブロック内の行の数が変化します。私は3つの部分(または3別々のファイル)にファイルを分割したいようにます:

<事前> <コード> part 1 contains all blocks starting with >3D_Helix part 2 contains all blocks starting with >1D_helix part 3 contains all blocks starting with >3d_other

次の方法を試してみました

<事前> <コード> prot_file = open(sys.argv[1], "r") flag = False for line in prot_file: if line.startswith (">3D_other"): flag == True if flag == True: print line それだけで1行目すなわち3d_helixを出力します。 iは各ブロックのサイズに基づいてブロックに分割オンラインにリストを発見した先端のほとんど(すなわち、大きさが特定の数に固定されることが知られているが、13と言います)。しかし、私の場合、私はサイズを知らないので、それらを使用することはできません。私が説明したように、ファイルを分割するための効率的な神託の方法をしたい。
英語

I have to work on a huge text file which contains data as blocks divided by a space.It is as follows:

>3D_helix;140 protein_name:AChR pore alpha subunit (Torpedo marmorata) file_name:ACh_pore_alpha.txt entry_date:3july03 refman_number:21022 endnote_number: author:Miyazawa,A., Fujiyoshi,Y., Unwin,N.(2003) [Structure and gating mechanism of the acetylcholine receptor pore] {Nature, 423, 949-955} remarks:Sequence is from PDB, chain A. There is additional 24 AA as signal sequence in Swiss-Prot.  TMhelices=4. pir_number: Swiss_Prot_entry:ACHA_TORMA Swiss_Prot_number:P02711 Swiss_Prot_gene:CHRNA1 Swiss_Prot_name:Acetylcholine receptor subunit alpha PDB_title:Acetylcholine Receptor Protein, alpha Chain PDB_Identifier:1OED N_terminal:in number_tmsegs:4 tm_segments:A.211,237;B.243,271;C.275,300;D.403,436 sequence:SEHETRLVANLLENYNKVIRPVEHHTHFVDITVGLQLIQLINVDEVNQIVETNVRLRQQWIDVRLRWNPADYGGIKKIRLPSDDVWLPDLVLYNNADGDFAIVHMTKLLLDYTGKIMWTPPAIFKSYCEIIVTHFPFDQQNCTMKLGIWTYDGTKVSISPESDRPDLSTFMESGEWVMKDYRGWKHWVYYTCCPDTPYLDITYHFIMQRIPLYFVVNVIIPCLLFSFLTVLVFYLPTDSGEKMTLSISVLLSLTVFLLVIVELIPSTSSAVPLIGKYMLFTMIFVISSIIVTVVVINTHHRSPSTHTMPQWVRKIFINTIPNVMFFSTMKRASKEKQENKIFADDIDISDISGKQVTGEVIFQTPLIKNPDVKSAIEGVKYIAEHMKSDEESSNAAEEWKYVAMVIDHILLCVFMLICIIGTVSVFAGRLIELSQEG*  >1D_helix;141 protein_name:AChR pore beta subunit (Torpedo marmorata) file_name:ACh_pore_beta.txt entry_date:3july03 refman_number:21022 endnote_number: author:Miyazawa,A., Fujiyoshi,Y., Unwin,N.(2003) [Structure and gating mechanism of the acetylcholine receptor pore] {Nature, 423, 949-955} remarks:Sequence is from PDB, chain B. There is additional 24 AA as signal sequence in Swiss-Prot. TMhelices=4. pir_number: Swiss_Prot_entry:Q6S3I0_TORMA Swiss_Prot_number:Q6S3I0 Swiss_Prot_gene:none Swiss_Prot_name:Acetylcholine receptor beta subunit PDB_title:Acetylcholine Receptor Protein, beta Chain PDB_Identifier:1OED N_terminal:in number_tmsegs:4 tm_segments:A.224,241;B.249,274;C.290,306;D.438,462 sequence:SVMEDTLLSVLFENYNPKVRPSQTVGDKVTVRVGLTLTSLLILNEKNEEMTTSVFLNLAWTDYRLQWDPAAYEGIKDLSIPSDDVWQPDIVLMNNNDGSFEITLHVNVLVQHTGAVSWHPSAIYRSSCTIKVMYFPFDWQNCTMVFKSYTYDTSEVILQHALDAKGEREVKEIMINQDAFTENGQWSIEHKPSRKNWRSDDPSYEDVTFYLIIQRKPLFYIVYTIVPCILISILAILVFYLPPDAGEKMSLSISALLALTVFLLLLADKVPETSLSVPIIISYLMFIMILVAFSVILSVVVLNLHHRSPNTHTMPNWIRQIFIETLPPFLWIQRPVTTPSPDSKPTIISRANDEYFIRKPAGDFVCPVDNARVAVQPERLFSEMKWHLNGLTQPVTLPQDLKEAVEAIKYIAEQLESASEFDDLKKDWQYVAMVADRLFLYIFITMCSIGTFSIFLDASHNVPPDNPFA*  >3D_other;143 protein_name:AChR pore delta subunit (Torpedo marmorata) file_name:ACh_pore_delta.txt entry_date:4dec03 refman_number:21022 endnote_number: author:Miyazawa,A., Fujiyoshi,Y., Unwin,N.(2003) [Structure and gating mechanism of the acetylcholine receptor pore] {Nature, 423, 949-955} remarks:Sequence is from PDB, chain C. Sequence in PDB has first 21 AA removed relative to Swiss-Prot. TMhelices=4. pir_number: Swiss_Prot_entry:Q6S3H8_TORMA Swiss_Prot_number:Q6S3H8 Swiss_Prot_gene:none Swiss_Prot_name:Acetylcholine receptor delta subunit PDB_title:Acetylcholine Receptor Protein, delta Chain PDB_Identifier:1OED N_terminal:in number_tmsegs:4 tm_segments:A.226,253;B.257,285;C.289,316;D.452,483 sequence:VNEEERLINDLLIVNKYNKHVRPVKHNNEVVNIALSLTLSNLISLKETDETLTTNVWMDHAWYDHRLTWNASEYSDISILRLRPELIWIPDIVLQNNNDGQYNVAYFCNVLVRPNGYVTWLPPAIFRSSCPINVLYFPFDWQNCSLKFTALNYNANEISMDLMTDTIDGKDYPIEWIIIDPEAFTENGEWEIIHKPAKKNIYGDKFPNGTNYQDVTFYLIIRRKPLFYVINFITPCVLISFLAALAFYLPAESGEKMSTAICVLLAQAVFLLLTSQRLPETALAVPLIGKYLMFIMSLVTGVVVNCGIVLNFHFRTPSTHVLSTRVKQIFLEKLPRILHMSRVDEIEQPDWQNDLKLRRSSSVGYISKAQEYFNIKSRSELMFEKQSERHGLVPRVTPRIGFGNNNENIAASDQLHDEIKSGIDSTNYIVKQIKEKNAYDEEVGNWNLVGQTIDRLSMFIITPVMVLGTIFIFVMGNFNRPPAKPFEGDPFDYSSDHPRCA 

Each block begins with either of the 3 given options. The number of lines in each block is varied. I want to divide the file into 3 parts(or 3 seperate file) such that :

part 1 contains all blocks starting with >3D_Helix part 2 contains all blocks starting with >1D_helix part 3 contains all blocks starting with >3d_other 

I tried the following method

prot_file = open(sys.argv[1], "r") flag = False for line in prot_file:     if line.startswith (">3D_other"):         flag == True     if flag == True:             print line 

but it prints only the 1st line i.e 3d_helix. Most of the tips i found online divide the list into blocks based on the size of each block (i.e the size is known to be fixed at a particular number ,say 13). However in my case I dont know the size and hence cannot use them. I want an efficient pythonic way to divide the file as explained.

</div
  

回答リスト

1
 
vote

これは私が思いついた解決策です:

<事前> <コード> #!/usr/bin/env python INPUT_FILE = 'input.txt' OUT_3D_HELIX = 'out_3dhelix.txt' OUT_1D_HELIX = 'out_1dhelix.txt' OUT_3D_OTHER = 'out_3dother.txt' f_input = open(INPUT_FILE, 'r') out_3dhelix = open(OUT_3D_HELIX, 'w') out_1dhelix = open(OUT_1D_HELIX, 'w') out_3dother = open(OUT_3D_OTHER, 'w') dest_file = None starting = True try: for line in f_input: if starting: ## We are at a block start if line.startswith('>3D_helix;'): dest_file = out_3dhelix elif line.startswith('>1D_helix;'): dest_file = out_1dhelix elif line.startswith('>3D_other;'): dest_file = out_3dother else: continue # Invalid line -- not a block beginning starting = False if not line.strip(): # Line is blank -- block end starting = True dest_file = None continue if dest_file is not None: # And never should be, at this point.. dest_file.write(line) finally: ## Close files... f_input.close() out_3dhelix.close() out_1dhelix.close() out_3dother.close()

基本的には、次の行を書き込む宛先ファイルを変更するために「ブロックスターター」を検出するために、すべてのファイル行ごとに読み込まれます。

 

This is the solution I came up with:

#!/usr/bin/env python  INPUT_FILE = 'input.txt' OUT_3D_HELIX = 'out_3dhelix.txt' OUT_1D_HELIX = 'out_1dhelix.txt' OUT_3D_OTHER = 'out_3dother.txt'  f_input = open(INPUT_FILE, 'r') out_3dhelix = open(OUT_3D_HELIX, 'w') out_1dhelix = open(OUT_1D_HELIX, 'w') out_3dother = open(OUT_3D_OTHER, 'w')  dest_file = None starting = True  try:     for line in f_input:         if starting:             ## We are at a block start             if line.startswith('>3D_helix;'):                 dest_file = out_3dhelix             elif line.startswith('>1D_helix;'):                 dest_file = out_1dhelix             elif line.startswith('>3D_other;'):                 dest_file = out_3dother             else:                 continue   # Invalid line -- not a block beginning             starting = False          if not line.strip():  # Line is blank -- block end             starting = True             dest_file = None             continue          if dest_file is not None:  # And never should be, at this point..             dest_file.write(line)  finally:     ## Close files...     f_input.close()     out_3dhelix.close()     out_1dhelix.close()     out_3dother.close() 

Basically, it reads all the file line-by-line, detecting "block starters" in order to change the destination file in which to write the following line.

</div
 
 

関連する質問

55  Djangoのクラスビュー  ( Class views in django ) 
Django ビューを表示するために、少しだけを変更したい場合に問題が発生する可能性があります。機能性はい、私は関数内のステートメント内のステートメントの場合は、millionのキーワード引数を持つことができますが、私はオブジェクト指向アプローチを考えてい...

41  Mac上の表示名からフォントへのフルパスを見つけるにはどうすればよいですか。  ( How can i find the full path to a font from its display name on a mac ) 
PhotoshopのJavaScript APIを使用して、特定のPSDのフォントを見つけています。 APIから返されたフォント名を指定して、フォント名がディスク上に対応する実際の物理フォントファイルを見つけたい。 これはOSX上で実行されているPytho...

682  既存のオブジェクトインスタンスへのメソッドを追加する  ( Adding a method to an existing object instance ) 
Pythonで既存のオブジェクトにメソッドを追加することが可能であることを読みました。 私はそれがそうするのが常に良いわけではないことを理解しています。しかし、どれほどどんなにこれを行うかもしれませんか? ...

62  Python CodeBaseのための連続統合システム  ( Continuous integration system for a python codebase ) 
私は python codebaseを使用して趣味プロジェクトで仕事を始めています。 cruisecontrol または teamcity と同様に、テストが失敗したときに責任ある人にNAG電子メールを送信し、送信します。 私はほとんどの vcses でフ...

49  WindowsでPDFのプレビューJPEGを入手してください。  ( Get a preview jpeg of a pdf on windows ) 
PDFの最初のページのJPEGプレビューを生成する必要があるクロスプラットフォーム(Python)アプリケーションを持っています。 Mac上で産卵しています SIPS 。 Windowsでできることができるようなものはありますか? ...

50  CX_ORACLE:結果セットをどのように繰り返すのですか?  ( Cx oracle how do i iterate over a result set ) 
結果セットを繰り返す方法はいくつかあります。それぞれのトレードオフは何ですか? ...

39  PythonとMySQL  ( Python and mysql ) 
PostgreSQLを操作するようにPythonを取得することができますが、MySQLで動作することはできません。主な問題は、私がDjangoやPysqlなどのものをインストールする機能を持っていない共有ホスティングアカウントでは、私のコンピュータにインスト...

536  IterTools.Groupby()を使用する方法  ( How do i use itertools groupby ) 
Pythonの itertools.groupby() 機能を実際に使用する方法については、わかりやすい説明を見つけることができませんでした。私がやろうとしていることはこれです: リストを取ります - この場合、objectified lxml 要素の子...

51  配列内のPythonオブジェクトの属性と一致するように 'in'を使用する  ( Using in to match an attribute of python objects in an array ) 
私は夢見ていたかどうかを覚えていませんが、私は何かを許可されている機能があることを思い出すようです、 <事前> <コード> foo in iter_attr(array of python objects, attribute name) 私はドキュメントを...

77  PythonのXML処理[閉じた]  ( Xml processing in python ) 
閉鎖。この質問は意見ベースです。現在答えを受け付けていません。 この質問を改善したいですか? ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有