繁体   English   中英

从完整路径列表中提取文件名?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM