如何将一个函数应用到带有 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()
所以我构建了一个函数,它将查看文件夹中的所有 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()