如何将一个函数应用到带有 Python 的文本或 csv 文件中列表中的所有项目?

How do I apply a function to all items in a list in a text or csv file with Python?

所以我构建了一个函数,它将查看文件夹中的所有 xml 文件,查找节点属性(演讲者姓名)并写入 csv 文件中的一行。请注意,目前,它将它们全部附加到同一个 csv 文件,但我希望在我想出下一步后让它更改文件名。

我尝试做的下一步是从文本文件的列表中提供这些演讲者姓名(我还尝试了一个 csv 文件和一个词典列表)并将该功能应用于每个这些发言者的名字分别。

我用一个函数来做,因为我认为 for-loop 在另一个项目中迭代一组项目 for-loop 迭代不同的项目集有点冒险,并且初步我用那个做的测试,没有证明担心是错误的。

当我单独粘贴此列表中的任何项目作为函数中的参数时,它起作用了。当我通过我尝试过的任何方式访问后打印列表时,它有效,我似乎无法让两者交谈。

我尝试按以下方式将函数应用于每个项目,但它所做的只是打印出我在 except 语句中给出的错误,并在 header 列中写入csv(所以我知道它至少在访问函数)

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)

见鬼,我什至尝试将其作为字典列表打开,因为数据已经用大括号括起来了。没有变化。

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

我也仿照我所做的脚本从列表中获取 url 并对它们执行几个 urllib 函数,尝试了这个:

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()

我不确定当我执行这些操作时,问题是否是整个列表都被同时输入到函数中,但如果函数本身有问题,阻止它工作,它是这里:

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

如能提供任何帮助,我们将不胜感激,否则我将只能从 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

请看看这是否适合你。

我相信,您需要以附加模式打开 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()