2016-06-24 15 views
0

私はこのようなテキストファイルがありますので、python 3.0でファイルのセクションを別々のリストに書き込むにはどうすればいいですか?

line 1 
line 2 
. 
. 
END OF SECTION 1, BEGIN SECTION 2 
line 100 
line 101 
. 
. 
END OF SECTION 2, BEGIN SECTION 3 
line 999 
line 1000 
. 
. 
END OF SECTION 3, BEGIN SECTION 4 
END OF SECTION 4, BEGIN SECTION 5 
line 5000 
line 5001 
. 
. 
END OF SECTION 5 
Q 

を、このファイルには、セクションごとにデータの記録/ラインの変数#と5つのセクション(セクションは、ラインの同じ#を持っていないすべてのんを持っています一部のセクションにはデータがまったくありません)。

私の仕事はこのファイルを読んで、各セクションをリストに分けることです(私の例では、5つの別々のリストになります)。そして、それをワークシートで構成されたExcelブックに書き出します。リスト。

section_01_log
section_02_log
section_03_log
section_04_log
section_05_log

、その後、私のExcelワークブックは、これらの5つのタブ/ワークシートを持っています。したがって、私は私が呼び出しています5つのリストで終わるしたいですそれ。


今のところ私は最初の部分(リストを作成する)に苦労していますし、助けてください。私がこれを手に入れると、2番目の部分で作業します。これは、Excelワークブックにリストを書いています。

がここに残念ながら私のコード

#read the file into a list named "input_file" already defined 
datafile = open(os.path.join(path,'filename')) 
for line in datafile: 
    input_file.append(line) 
datafile.close() 

# parse the "input_file" list and write only section 1 
for line in input_file: 
    if line.startswith('END OF SECTION 1'): 
     exit 
    else: 
     section_01_log.append(line) 

だ、これは動作しません。 section_01_logはinput_fileの内容全体を書き続けます。どうして?最初のセクションをsection_01_logに分けて、他のすべてのセクションで同じようにするにはどうしたらいいですか?

答えて

0

だから、あなたは右、このコマンドを使用してあなたのリストを持っている:

myList = [] 
with open("test.txt", 'r') as fileopen: 
    myList = [line.strip() for line in fileopen] 
print (myList) 

出力:

['line 1', 'line 2', 'END OF SECTION 1, BEGIN SECTION 2', 'line 100', 'line 101', 'END OF SECTION 2, BEGIN SECTION 3', 'line 999', 'line 1000', 'END OF SECTION 3, BEGIN SECTION 4', 'END OF SECTION 4, BEGIN SECTION 5', 'line 5000', 'line 5001', 'END OF SECTION 5'] 

を使用すると、Excelファイルに書き込みたい場合は、私はステップによって、この手順を実行することをお勧め:

  1. は異なるリストの各セクションを分離
  2. EXを作成

    :CELファイル
  3. が(それは非常にきれいではありません、あなたはあまりにも多くのリストを持っている場合に再現するべきではありません)あなたのリストを分割する

1.An簡単な方法をExcelファイルにあなたのリストを作成します

section1 = myList[0:myList.index("END OF SECTION 1, BEGIN SECTION 2")] 
section2 = myList[myList.index("END OF SECTION 1, BEGIN SECTION 2")+1 : myList.index("END OF SECTION 2, BEGIN SECTION 3")] 
section3 = myList[myList.index("END OF SECTION 2, BEGIN SECTION 3")+1 : myList.index("END OF SECTION 3, BEGIN SECTION 4")] 
section4 = myList[myList.index("END OF SECTION 3, BEGIN SECTION 4")+1 : myList.index("END OF SECTION 4, BEGIN SECTION 5")] 
section5 = myList[myList.index("END OF SECTION 4, BEGIN SECTION 5")+1 : myList.index("END OF SECTION 5")] 

基本的には、インデックスを作成してリストを分割するだけです。簡単?

2. Excelファイルを作成して、才能シートを作成します。 xlwt:

import xlwt 

xl = xlwt.Workbook(encoding="utf-8") 

section_01 = xl.add_sheet("section_01_log") 
section_02 = xl.add_sheet("section_02_log") 
section_03 = xl.add_sheet("section_03_log") 
section_04 = xl.add_sheet("section_04_log") 
section_05 = xl.add_sheet("section_05_log") 

3をインポートする必要があります。あなたは、Excelファイルへの書き込み、私はこれを行うためのクリーンな方法がある以前に言ったように、あなたは

for i, r in enumerate(section1): 
    section_01_log.write(i, 0, r) 
for i, r in enumerate(section2): 
    section_02_log.write(i, 0, r) 
for i, r in enumerate(section3): 
    section_03_log.write(i, 0, r) 
for i, r in enumerate(section4): 
    section_04_log.write(i, 0, r) 
for i, r in enumerate(section5): 
    section_05_log.write(i, 0, r) 

xl.save("logs.xls") 

:)保存しますが、私はルーキー...

0

理由あなたのコードのISN」ですexitはforループから抜け出すことを前提としていると思われるので、その場合はbreakステートメントが必要なので、あなたは思っていることをしないからです。 exitは組み込み定数で、呼び出されるとexit() - raise SystemExitとなり、インタラクティブなインタプリタを終了する便利な方法です。あなたがそれを呼び出さなかったので、それは単に文字列に評価され、あなたのforループはそのまま続く。

https://docs.python.org/2/library/constants.html#exit

、限り、それはあなたが一例として与えたものと同様の構成、そしてそれはかなり基本的な使用されるよう、以下のアプローチが動作するはずですし、それはより多くても少なくて5つのセクションを持つファイルのために働きます命令的なpython。

この例では、テキストファイルから作られた
{1: ['line 1', 'line 2', 'line 3', 'line4'], 
2: ['line 100', 'line 101', 'line 102', 'line 103'], 
3: ['line 999', 'line 1000', 'line 1001', 'line 1003'], 
4: [], 
5: ['line 5000', 'line 5001', 'line 5002', 'line 5003']} 

私は「Q」は

with open('testing.txt') as f: 
    log = {1:[]} 
    i = 1 
    new_section = False # flag to prevent creating sections just for sentinel 
    for line in f: 
     line = line.strip() 

     if line == 'Q': # if we have reached the end of the file 
      break 
     elif new_section: 
      i += 1 
      log[i] = [] 
      new_section = False 

     if line.startswith('END OF SECTION'): 
      new_section = True 
     else: 
      log[i].append(line) 

logの終わりを知らせるためにセンチネル値として使用されていると仮定すると、今、このような辞書です

line 1 
line 2 
line 3 
line4 
END OF SECTION 1, BEGIN SECTION 2 
line 100 
line 101 
line 102 
line 103 
END OF SECTION 2, BEGIN SECTION 3 
line 999 
line 1000 
line 1001 
line 1003 
END OF SECTION 3, BEGIN SECTION 4 
END OF SECTION 4, BEGIN SECTION 5 
line 5000 
line 5001 
line 5002 
line 5003 
END OF SECTION 5 
Q 
関連する問題