迭代多个文件,将日期提取到另一个文件

时间:2017-04-17 15:09:08

标签: python python-3.4

好的我有一个有多个文件夹的源目录。每个文件夹都有一个名为tvshow.nfo的文件,我想从中提取数据。我写了以下内容 -

import sys
import os
import re
from pathlib import Path

L = []
my_dir = "./source/"
for item in Path(my_dir).glob('./*/tvshow.nfo'):
    M = str(item).splitlines()
    for i in M:
        f = open(i, "r")
        for i in f:
            for j in re.findall("<title>(.+)</title>", i):
                L.append(j)
            for j in re.findall("<year>(.+)</year>", i):
                L.append(j)
            for j in re.findall("<status>(.+)</status>", i):
                L.append(j)
            for j in re.findall("<studio>(.+)</studio>", i):
                L.append(j)
        for i in L:
            print (i)
        f.close()

我使用glob来确定所有nfos的确切路径,然后使用分割线分隔每个路径,在每个路径上迭代文件,然后使用正则表达式提取信息。并尝试将此信息附加到空列表中。我得到以下输出 -

APB
2017
Continuing
FOX (US)
APB
2017
Continuing
FOX (US)
Angie Tribeca
2016
Continuing
TBS
APB
2017
Continuing
FOX (US)
Angie Tribeca
2016
Continuing
TBS
Arrow
2012
Continuing
The CW
['APB', '2017', 'Continuing', 'FOX (US)', 'Angie Tribeca', '2016', 'Continuing', 'TBS', 'Arrow', '2012', 'Continuing', 'The CW']

我希望将输出导出为新文件:

APB 2017 Continuing FOX (US)
Angie Tribeca 2016 Continuing TBS
Arrow 2012 Continuing The CW

任何人都可以帮助我吗?还有比我尝试过的更好的方法吗?

3 个答案:

答案 0 :(得分:1)

根据您展示的内容,您可以尝试一下。

import sys
import os
import re
from pathlib import Path

info = []
my_dir = "./source/"
for item in Path(my_dir).glob('./*/tvshow.nfo'):
    M = str(item).splitlines()
    for i in M:
        L = []
        f = open(i, "r")
        for i in f:
            for j in re.findall("<title>(.+)</title>", i):
                L.append(j)
            for j in re.findall("<year>(.+)</year>", i):
                L.append(j)
            for j in re.findall("<status>(.+)</status>", i):
                L.append(j)
            for j in re.findall("<studio>(.+)</studio>", i):
                L.append(j)
        f.close()
        info.append(' '.join(L))
with open("new_file", "w") as w:
    for i in info:
        w.write(i + "\n")

答案 1 :(得分:0)

您应该以更易于阅读的方式构建数据,而不是为每个节目制作一个包含所有不同属性的列表。一种可能性是列表列表,其中顶级列表每个节目有一个条目,内部列表包含一个节目的标题,年份,状态和工作室属性。您可以非常轻松地修改现有代码来完成此任务:

    for i in f:
        show_attributes = []
        for j in re.findall("<title>(.+)</title>", i):
            show_attributes.append(j)
        for j in re.findall("<year>(.+)</year>", i):
            show_attributes.append(j)
        for j in re.findall("<status>(.+)</status>", i):
            show_attributes.append(j)
        for j in re.findall("<studio>(.+)</studio>", i):
            show_attributes.append(j)
        L.append(show_attributes)
    for i in L:
        for attribute in i:
            print(attribute, end=' ')
    f.close()

答案 2 :(得分:0)

从您的示例看,每个节目的所有标签都在一行上。

如果节目的所有标签都在一行上,我认为这样的事情可能会有所帮助:

import sys
import os
import re
from pathlib import Path


def find_tag(tag, l):
    ''' returns result of findall on a tag on line l'''
    full_tag = "<" + tag + ">(.+)</" + tag + ">"
    return re.findall(full_tag, l)


L = []
my_dir = "./source/"
for item in Path(my_dir).glob('./*/tvshow.nfo'):
    # changed the file variable to data_file
    M = str(item).splitlines()
    for data_file in M:
        # use with to open the file without needing to close it
        with open(data_file, "r") as f:

            for line in f:
                title = find_tag("title", line)
                year = find_tag("year", line)
                status = find_tag("status", line)
                studio = find_tag("studio", line)
                L.append(' '.join(str(d[0]) for d in [title, year, status, studio] if d))

# print the data or whatever else you're doing with it
for data in L:
    print(data)

这使用with打开文件,无需使用try-catch并自行关闭它。有关with的信息,请访问:file methods

需要

str(d[0])才能将组列表项从re.findall更改为字符串。 if d是为了防止该行上缺少标记(并且我可能误解了标记在文件中的放置方式,如果我这样,那就很抱歉)

还可以使用列表理解构建LL = [(find_tag("title", line), find_tag("year", line), find_tag("status", line), find_tag("studio", line)) for line in f]而不是附加到列表中。

然后可以在打印列表时使用join方法:print(' '.join(str(d[0]) for d in data if d))

是否要这样做取决于你对列表推导的喜欢程度。

我还创建了一个find_tag函数,但这主要来自我试图弄清楚发生了什么。

如果不知道文件是什么样的,很难说你是否应该在一个单独的行上查找每个文件。如果订单重要或者您是否需要进行任何错误处理,也很难判断。