2017-09-12 17 views
1

私はPython 3.6でテキストパーサーを作成しています。私は以下のようにファイルのレイアウトを持っている:Python - すべてのテキストファイルを再帰的に繰り返す

(私が使用する実際のファイル構造はこれよりもはるかに広範囲である)

-Directory(main folder) 
    -amerigroup.txt 
    -bcbs.txt 
    childfolder 
     -medicare.txt 

私は(を経由して追加する2つの異なるリストにテキストを抽出する必要があります私の成長し続けるリストに)。現在のコードを実行するたびに、自分のプログラムがmedicare.txtファイルを開いて情報を読み込んで抽出するようには見えません。そのようなファイルやディレクトリがないことを示すエラーが表示されます: 'medicare.txt'。

私の目標は、3つのファイルからデータを取得し、一度にそれを抽出することです。 amerigroupとbcbsのデータをどのようにしてchildfolderに入れ、medicare.txtを取得したら、それを私のファイルパスのすべてのブランチに対して繰り返すのですか?

このコードスニペットでテキストファイルを開いて閉じようとしています。これまで私がこれまで持っていたことは次のとおりです。

import re 
import os 
import pandas as pd 

#change active directory 
os.chdir(r'\\Centerstone.lan\Files\HomeDrive\angus.gray\My Documents\claimstest') 
#rootdir = r'\\Centerstone.lan\Files\HomeDrive\angus.gray\My Documents\claimstest' 

#set up Regular Expression objects to parse X12 
claimidRegex = re.compile(r'(CLM\*)(\d+)') 
dxRegex = re.compile(r'(ABK:)(\w\d+)(\*|~)(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?') 

claimids = [] 
dxinfo = [] 

for dirpath, dirnames, files in os.walk(topdir): 
    for name in files: 
     cid = [] 
     dx = [] 
     if name.lower().endswith(exten): 
      data = open(name, 'r') 
      data.close() 

私にこれを手伝ってくれてありがとう!

編集:これまでのところ歩き回ってみました。私の最新の試み(私もtxtfile_full_path使用してみました - 動作しませんでした):興味のある人のため

for dirpath, dirnames, filename in os.walk(base_dir): 
    for filename in filename: 
     #defining file type 
     txtfile=open(filename,"r") 
     txtfile_full_path = os.path.join(dirpath, filename) 
     print(filename) 

EDIT2。あなたがopenへのフルパスを渡す必要が

import re 
import os 
import pandas as pd 


#change active directory 
os.chdir(r'\\Centerstone.lan\Files\HomeDrive\angus.gray\My Documents\claimstest') 
base_dir = (r'\\Centerstone.lan\Files\HomeDrive\angus.gray\My Documents\claimstest') 

#set up Regular Expression objects to parse X12 
claimidRegex = re.compile(r'(CLM\*)(\d+)') 
dxRegex = re.compile(r'(ABK:)(\w\d+)(\*|~)(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?') 

claimids = [] 
dxinfo = [] 

for dirpath, dirnames, filename in os.walk(base_dir): 
    for filename in filename: 
     txtfile_full_path = os.path.join(dirpath, filename) 
     x12 = open(txtfile_full_path, 'r') 
     for i in x12: 
      match = claimidRegex.findall(i) 
      for word in match: 
       claimids.append(word[1]) 
     x12.seek(0) 
     for i in x12: 
      match = dxRegex.findall(i) 
      for word in match: 
       dxinfo.append(word) 
     x12.close() 

datadic = dict(zip(claimids, dxinfo)) 
+0

あなたは 'os.path.join(DIRPATH、名前のようなものを使用する必要があります) ' –

+0

だから、あなたの作業ディレクトリには' medicare.txt'が見当たらないので、フルパスか認識できる相対パスを指定する必要があります。 –

+0

元、私はこれを撃ったが、私は同じエラーが発生し続ける。 FileNotFoundError:[エラー番号2]このようなファイルまたはディレクトリ:os.walkでDIRPATH、にdirnames、ファイル名(BASE_DIR)のための 'medicare.txt' ': ファイル名のファイル名に: #definingファイルタイプ txtfile = (ファイル名) ' –

答えて

0

:これは問題の私の最終的な解決策でした。どこかで文字列変数を作成するだけで何もできません!だから、次はあなたのエラーを回避する必要があります。

txt_list = [] 
for dirpath, dirnames, filename in os.walk(base_dir): 
    for filename in filename: 
     # create full path 
     txtfile_full_path = os.path.join(dirpath, filename) 
     with open(txtfile_full_path) as f: 
      txt_list.append(f.read()) 

今あなたの正規表現に基づいて分離を統合するのに十分な簡単なはず...

+0

これは素晴らしいです、ありがとう! これは、ファイルパスの深さに関係なく機能します。 –

+0

@AngusGrayする必要があります。 –

関連する問題