好的我有一个有多个文件夹的源目录。每个文件夹都有一个名为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
任何人都可以帮助我吗?还有比我尝试过的更好的方法吗?
答案 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
是为了防止该行上缺少标记(并且我可能误解了标记在文件中的放置方式,如果我这样,那就很抱歉)
还可以使用列表理解构建L
:
L = [(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
函数,但这主要来自我试图弄清楚发生了什么。
如果不知道文件是什么样的,很难说你是否应该在一个单独的行上查找每个文件。如果订单重要或者您是否需要进行任何错误处理,也很难判断。