2017-06-02 6 views
1

私は少し正確に進んでいくので、ちょっとしたナッジが非常に役に立ちます。Python:データフレームへの複数のテキストファイル

実際には、の書式にある〜1800件のテキストファイルがあります。それの要点です

From: Person-1 [[email protected]] 
Sent: Tuesday, April 18, 2017 11:24 AM 
To: [email protected] 
Subject: Important Subject 

User, 

Below is your search alert. 

Target: text 

Attribute: text 

Label: abcdef 

Time: Apr 18, 2017 11:24 EDT 

Full Text: Text of various length exists here. Some files even have links. I'm not sure how I would capture a varied length field. 

Recording: abcde & fghijk lmnop 

を次のように

各ファイルの構造があります。

私はCSVとして保存できるDFに書きたいと思います。

私は多分このようなもので終わりたいですか?

2番目の行は別のテキストファイルです。

すべてのテキストファイルを読み込んで印刷するコードがあります。そのコードは次のとおりです。

# -*- coding: utf-8 -*- 
import os 
import sys 

# Take all text files in workingDirectory and put them into a DF. 
def convertText(workingDirectory, outputDirectory): 
    if workingDirectory == "": workingDirectory = os.getcwd() + "\\" # Returns current working directory, if workingDirectory is empty. 
    i = 0 
    for txt in os.listdir(workingDirectory): # Iterate through text filess in workingDirectory 
     print("Processing File: " + str(txt)) 
     fileExtension = txt.split(".")[-1] 
     if fileExtension == "txt": 
      textFilename = workingDirectory + txt # Becomes: \PATH\example.text 
      f = open(textFilename,"r") 
      data = f.read() # read what is inside 
      print data # print to show it is readable 

      #RegEx goes here? 

      i += 1 # counter 
    print("Successfully read " + str(i) + " files.") 


def main(argv): 
    workingDirectory = "../Documents/folder//" # Put your source directory of text files here 
    outputDirectory = "../Documents//" # Where you want your converted files to go. 

    convertText(workingDirectory, outputDirectory) 

if __name__ == "__main__": 
    main(sys.argv[1:]) 

私はおそらく、ファイルを解析するためにRegExが必要でしょうか?あなたは何をお勧めします?

私はそれが理にかなっていれば、Rなどを使用することに反対していません。

ありがとうございます。

答えて

1

正規表現で十分です。正規表現のr"\sTarget:(.*)を使用すると、Target:に一致する行のすべてを照合し、照合して反復するすべてのフィールドのリストを作成することで、各フィールドの値を格納する辞書オブジェクトを構築できます。ファイルこれを処理するために

import os 
import sys 
import re 
import csv 

# Take all text files in workingDirectory and put them into a DF. 
def convertText(workingDirectory, outputDirectory): 
    with open(outputDirectory+'emails.csv', 'w') as csvfile: # opens the file \PATH\emails.csv 
     fields = ['Target','Attribute','Label','Time','Full Text'] # fields you're searching for with regex 
     csvfield = ['Target','Attribute','Label','Time','Full Text','Filename'] # You want to include the file name in the csv header but not find it with regex 
     writer = csv.DictWriter(csvfile, delimiter=',', lineterminator='\n', fieldnames=fields) 
     writer.writeheader() # writes the csvfields list to the header of the csv 

     if workingDirectory == "": workingDirectory = os.getcwd() + "\\" # Returns current working directory, if workingDirectory is empty. 
     i = 0 
     for txt in os.listdir(workingDirectory): # Iterate through text filess in workingDirectory 
      print("Processing File: " + str(txt)) 
      fileExtension = txt.split(".")[-1] 
      if fileExtension == "txt": 
       textFilename = workingDirectory + txt # Becomes: \PATH\example.text 
       f = open(textFilename,"r") 
       data = f.read() # read what is inside 

       #print(data) # print to show it is readable 
       fieldmatches = {} 
       for field in fields: 
       regex = "\\s" + field + ":(.*)" # iterates through each of the fields and matches using r"\sTarget:(.*) that selects everything on the line that matches with Target: 
       match = re.search(regex, data) 
       if match: 
        fieldmatches[field] = match.group(1) 
       writer.writerow(fieldmatches) # for each file creates a dict of fields and their values and then adds that row to the csv 
       i += 1 # counter 
     print("Successfully read " + str(i) + " files.") 


def main(argv): 
    workingDirectory = "../Documents/folder//" # Put your source directory of text files here 
    outputDirectory = "../Documents//" # Where you want your converted files to go. 

    convertText(workingDirectory, outputDirectory) 

if __name__ == "__main__": 
    main(sys.argv[1:]) 

Python CSV library CSVファイルを作成し、ディレクトリ内の各.txtファイルに対してwriter.writerow({'Target':'','Attribute':'','Time':'','Filename':'','Label':''})

例と一致辞書フィールドの行をプッシュすることができます使用

私のマシンでは十分に速くなければなりませんでした。それは1秒未満でした。

Successfully read 1866 files. 
Time: 0.6991933065852838 

希望すると便利です!

+0

素晴らしい!そんなにアレッシー42ありがとう!これは魅力的に機能しました。今私はただ一つの質問があります。いくつかの例では、 "フルテキスト"の次の数行は "フルテキスト"の一部ですが、何らかの理由で含まれていません。基本的に「録音する前のすべての行を「フルテキスト」の一部にする必要があります」と言う方法はありますか? – kabaname

+0

ドット区切りに新しい行を追加し、終端記号を設定してリストの次の項目にするか、またはフルテキスト選択を忘れてしまいます。これの正規表現は '\ sFull Text :((。| \ n)*?)(Recording:)' https://regex101.com/r/ODbJrz/3を参照してください。 –

関連する問題