【问题标题】:How do I apply a function to all items in a list in a text or csv file with Python?如何使用 Python 将函数应用于文本或 csv 文件中列表中的所有项目?
【发布时间】:2016-08-24 22:08:33
【问题描述】:

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

我尝试做的下一步是从文本文件的列表中提供这些演讲者姓名(我也尝试过 csv 文件和字典列表),并将函数应用于其中的每一个单独的扬声器名称。

我正在使用一个函数来执行此操作,因为我认为一个 for 循环遍历另一个 for 循环中的一组项目,该循环遍历一组不同的项目是一种机会,我对此进行了初步测试,并没有证明这种担心是错的。

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

我尝试通过以下方式将该函数应用于每个项目,但它所做的只是打印出我给 except 语句的错误,并写在 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

【问题讨论】:

  • 请向我们提供您在查询中列出的不同输入文件中的示例数据。
  • 当然,刚刚添加,见上文。
  • 主要问题是,您将 speakerAttrib 作为字符串传递并进行比较。我刚刚将其转换为字典变量。第二个是获取节点的属性作为一个列表,而不是一个 lxml 元素。

标签: python-2.7 for-loop user-defined-functions readfile readlines


【解决方案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()

【讨论】:

  • 感谢一百万,这完全有效!我确实想让它在某个时候为每个扬声器制作一个不同的文件,但正在做一些小步骤,至少尝试先遍历列表。希望我能从那里得到它,并且在我尝试的时候不会回到这里。
  • 不客气。如果您能接受我的回答是正确的,我将不胜感激。谢谢。
  • 是支票吗?刚刚做到了
  • 所以我试图让代码在通过文件查找该扬声器时为每个扬声器启动一个不同的文件,但除了创建文件之外,我无法让它做任何事情,但是除了标题之外创建空白,或者创建仅包含其中 xml 文件中的所有信息的文件 - 我把 ?在这里,但由于这两个是相关的,想知道你是否介意再看一下。 stackoverflow.com/questions/36962273/… - 谢谢!
  • 等一下 - 这个原始代码不会寻找特定的扬声器,它只是通过扬声器将整个内容弹出到 csv 文件中。请再看一遍
猜你喜欢
  • 2019-08-28
  • 2020-02-13
  • 2020-10-01
  • 2014-08-15
  • 2015-03-09
  • 1970-01-01
  • 2021-05-30
  • 2015-05-28
  • 2018-10-31
相关资源
最近更新 更多