1

私はフォルダー内のすべてのXMLファイルを調べ、ノード属性(話者名)を探し、csvファイルの行に書き込む関数を作成しました。注意してください、現時点では、それらはすべて同じcsvファイルに追加されますが、私は次のステップを見つけた後にファイル名を変更するようにしています。PythonでテキストまたはCSVファイル内のリスト内のすべての項目に関数を適用するにはどうすればよいですか?

私がやってみようとしていた次のステップは、テキストファイルのリスト(これらのスピーカー名をCSVファイルと辞書のリストを試してみました)からそれらのスピーカー名を指定して、それらのスピーカー名は個別に

私はforループの反復を、別のforループの中のアイテムのセットを使って繰り返すことを考えました。これは、異なるセットのアイテムを反復することは、ちょっとした気分でした。私はそれを使って予備テストを行いましたその心配が間違っていることを証明していない。

このリストの項目のいずれかに、関数の引数として個別に貼り付けると機能します。私が試みた方法のいずれかを使ってアクセスした後にリストを印刷すると、それは機能しますが、私は2つを話すことができません。

私は以下の方法で各項目に関数を適用しようとしましたが、私はexcept文に与えたエラーを出力し、csvのヘッダー列に書き込みますデータがすでにその周りに中括弧を持っていたので)、それは、少なくとも機能にアクセスするのITの一体のための

speaker_list = open("UAS_Speakers.csv","r").readlines() 
for item in speaker_list: 
    look_for_speaker_in_files(item) 

または

with open("speaking.txt","r") as f: 
    for x in f:  
     look_for_speaker_in_files(x) 

を知って、私も辞書のリストとしてそれを開こうとしました。変化なし。

def main(): 
    with open("speaking.py","r") as speaker_list: 
     for x in speaker_list: 
      look_for_speaker_in_files(x) 
if __name__ == "__main__": 
    main() 

私がもしわからない:

speaker_list = open("speaking.py","r") 
    for x in speaker_list: 
     look_for_speaker_in_files(x) 

は、私はまた、私はそのリストからURLを取得し、それらにurllibは機能のカップルを実行していたスクリプトをモデルに、これは試してみました問題は、私はこれらのいずれかを行う際に、全リストは、すべてを一度に関数に供給されているが、場合にfucntion自体に何か問題があると、作業からこれを防止すること、それはここにあるある:

def look_for_speaker_in_files(speakerAttrib): 
    c = csv.writer(open("allspeakers.csv","w")) 
    c.writerow(["Name", "Filename", "Text"]) 
    for cr_file in glob.iglob('parsed/*.xml'): 
     try: 
      tree = etree.parse(cr_file) 
      for node in tree.iter('speaking'): 
      if node.attrib == speakerAttrib: 
       c.writerow([node.attrib, cr_file, node.text]) 
      else: 
       continue 
     except: 
      print "bad string " + cr_file 
      continue 

どれでも彼lpはこれで大いに感謝しています。そうでなければ、私はOpenRefineから手作業でこれを整理したり、数百人のスプレッドシートからコピー&ペーストしたりします。その考えが私の眼球を燃やします。

サンプルリスト項目:

{'name': 'Mr. BEGICH'} 
{'name': 'The SPEAKER pro tempore (Mr. Miller of Florida)'} 
{'name': 'The Acting CHAIR'} 
{'name': 'Mr. McKINLEY'} 
{'quote': 'true', 'speaker': 'recorder'} 
{'name': 'Mr. WAXMAN'} 
{'name': 'Mr. MORAN'} 
{'name': 'Mr. McKEON'} 
{'quote': 'true', 'speaker': 'The Acting CHAIR'} 
{'name': 'Mr. RIGELL'} 
{'name': 'Mr. SMITH of Washington'} 
{'name': 'Mr. KILMER'} 
{'name': 'Mr. LAMBORN'} 
{'name': 'Mr. CLEAVER'} 
{'name': 'Mr. MICA'} 
{'name': 'Ms. SPEIER'} 
{'name': 'Mrs. ELLMERS'} 

サンプルファイルこのフォルダにあります。 https://drive.google.com/folderview?id=0B7lGA34vOZItREhRbmF6Z3YtTnM&usp=sharing

+0

クエリに記載されているさまざまな入力ファイル内のサンプルデータを入力してください。 – pmaniyan

+0

もちろん、上記を参照してください。 –

+0

主な問題は、speakerAttribを文字列として渡して比較していたことでした。私はちょうどそれを辞書変数に変換しました。 2つ目は、lxml要素ではなく、ノードの属性をリストとして取得することでした。 – pmaniyan

答えて

1

これはあなたのために良い動作するかどうかを確認してください。

私は、追加モードでallspeakers.csvファイルを開く必要があると考えています。それ以外の場合は、各main()で置き換えられます。それ以外の場合は、新しいファイルに書き込む必要があります。

import csv 
import glob 
import ast 
from os.path import isfile 
from lxml import etree 

def look_for_speaker_in_files(speakerAttrib): 
    speakerDict = ast.literal_eval(speakerAttrib) 
    l_file_exists = False 
    if isfile("allspeakers.csv"): 
     l_file_exists = True 
    c = csv.writer(open("allspeakers.csv","a")) 
    if not l_file_exists: 
     c.writerow(["Name", "Filename", "Text"]) 
    lparser = etree.XMLParser(recover=True) 
    for cr_file in glob.iglob('parsed/*.xml'): 
     try: 
      tree = etree.parse(cr_file,parser=lparser) 
      for node in tree.iter('speaking'): 
      if node.keys() == speakerDict.keys(): 
       c.writerow([node.attrib, cr_file, node.text]) 
      else: 
       continue 
     except: 
      print "bad string " + cr_file 
      raise 

def main(): 
    with open("UAS_speakers.txt","r") as speaker_list: 
     for x in speaker_list: 
      print x 
      look_for_speaker_in_files(x) 
if __name__ == "__main__": 
    main() 
+0

ありがとう、百万、それは完全に動作します!私は実際には、ある時点でそれぞれのスピーカーごとに異なるファイルを作成したいと思っていますが、赤ちゃんのステップを踏んでいて、少なくともリストを最初に反復しようとしていました。うまくいけば私はそこからそれを取得し、私がそれを試みるときにここに戻ってくることはありません。 –

+0

あなたは大歓迎です。あなたが私の答えを正しいものとして受け入れることができれば、本当に感謝します。ありがとう。 – pmaniyan

+0

はそのチェックですか?ちょうどそれをした –