![](/img/trans.png)
[英]Python - adding file names (not full paths) to list from directory and subfolders
[英]Pulling file names from a list of full paths?
我试图从特定格式的文档中提取文件名,并将它们放入列表中。 该文档包含大量信息,但我关注的各行如下所示,始终在该行的开头带有“文件名:”:
File Name: C:\windows\system32\cmd.exe
我尝试了以下方法:
xmlfile = open('my_file.xml', 'r')
filetext = xmlfile.read()
file_list = []
file_list.append(re.findall(r'\bFile Name:\s+.*\\.*(?=\n)', filetext))
这使得file_list
看起来像:
[['File Name: c:\\windows\\system32\\file1.exe',
'File Name: c:\\windows\\system32\\file2.exe',
'File Name: c:\\windows\\system32\\file3.exe']]
我正在寻找我的输出只是:
(file1.exe, file2.exe, file3.exe)
我也尝试在上面的输出中使用ntpath.basename
,但是看起来它想要一个字符串作为输入而不是一个列表。
我是Python和脚本编写的新手,所以任何建议都将不胜感激。
您可以使用以下正则表达式获得预期的输出:
file_list = re.findall(r'\bFile Name:\s+.*\\([^\\]*)(?=\n)', filetext)
([^\\\\]*)
将捕获最后一个路径分隔符之后的除斜杠之外的所有内容,直到遇到\\n
,请参见联机示例 。 由于findall
已经返回了列表,因此无需将返回值附加到现有列表中。
我将对此进行一些更改,以使它更清晰地读取和分离该过程-显然可以一步完成,但是我认为您的代码以后将很难管理
import re
import os
with open('my_file.xml', 'r') as xmlfile:
filetext = xmlfile.read() # this way the file handle goes away - you left the file open
file_list = []
my_pattern = re.compile(r'\bFile Name:\s+.*\\.*(?=\n)')
for filename in my_pattern.findall(filetext):
cleaned_name = filename.split(os.sep)[-1]
file_list.append(cleaned_name)
您可以采用更具声明性的样式来完成此操作。 它确保更少的错误,更高的内存效率。
import os.path
pat = re.compile(r'\bFile Name:\s+.*\\.*(?=\n)')
with open('my_file.xml') as f:
ms = (pat.match(line) for line in f)
ns = (os.path.basename(m) for m in ms)
# the iterator ns emits names such as 'foo.txt'
for n in ns:
# do something
如果您稍微修改正则表达式,即您甚至不需要os.path
。
您走在正确的轨道上。 basename
不起作用的原因是因为re.findall()
返回一个被放入另一个列表的列表。 这是一个修复程序,它遍历返回的列表并创建另一个仅具有基本文件名的列表:
import re
import os
with open('my_file.xml', 'rU') as xmlfile:
file_text = xmlfile.read()
file_list = [os.path.basename(fn)
for fn in re.findall(r'\bFile Name:\s+.*\\.*(?=\n)', file_text)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.