Python 通过忽略文件名的前3个字母来获取目录中的文件名

Python 通过忽略文件名的前3个字母来获取目录中的文件名,python,text,Python,Text,我必须通过python脚本读取目录中的所有文本文件,但首先我必须从每个文件中删除前3个字母,以生成索引列表 目录中包含数据的文件名如下所示 zzz143 zzz146 zzz150 . . . zzz250 我必须从所有文件中删除zzz,并在目录中列出所有这些文件的索引列表,以便从这些文件中读取数据。 我知道如何处理文件 zzz.160.dat 对于这些类型的文件,我使用以下代码删除前缀和后缀 def get_list(path, path_of_module_files ): prefix,

我必须通过python脚本读取目录中的所有文本文件,但首先我必须从每个文件中删除前3个字母,以生成索引列表

目录中包含数据的文件名如下所示

zzz143
zzz146
zzz150
.
.
.
zzz250
我必须从所有文件中删除zzz,并在目录中列出所有这些文件的索引列表,以便从这些文件中读取数据。 我知道如何处理文件

zzz.160.dat

对于这些类型的文件,我使用以下代码删除前缀和后缀

def get_list(path, path_of_module_files ):
prefix, suffix = path_of_module_files.split("<index>")
d = {}
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
for item in onlyfiles:
    if item.endswith(suffix) and item.startswith(prefix):
        text = item
        text = text[(find_str(text, prefix)+len(prefix)):]
        text = text[:find_str(text, suffix)]
        d[int(text)] = "/".join([path, item])
index_list = collections.OrderedDict(sorted(d.items(), key=lambda t: t[0]))
return index_list
而不是

zzz143
zzz144
zzz145
.
.
. 
.
zzz250

如果有人给我一个想法或例子,如何通过循环获取所有文件名,以提取该目录中的所有文件。如果您确定前缀为'zzz',我将非常感谢,您可以将其替换为,如下所示:

def get_list(path, path_of_module_files):
    filepath = os.path.join(path, path_of_module_files)
    d = {}
    if os.path.isfile(filepath):
        suffix = device_name_format.split(".")[0].replace('zzz', '')
        d[suffix] = os.path.abspath(filepath)

index_list = collections.OrderedDict(sorted(d.items(), key=lambda t: t[0]))

如果您确定前缀为“zzz”,则可以将其替换为,如下所示:

def get_list(path, path_of_module_files):
    filepath = os.path.join(path, path_of_module_files)
    d = {}
    if os.path.isfile(filepath):
        suffix = device_name_format.split(".")[0].replace('zzz', '')
        d[suffix] = os.path.abspath(filepath)

index_list = collections.OrderedDict(sorted(d.items(), key=lambda t: t[0]))

如果三个字母每次都不同,则可以使用切片表示法:

your_string = "ABC123"
your_string[3:]
>>> '123'
或者如果前缀每次都相同

your_string = "zzz123"
your_string.lstrip("zzz")
>>>> '123'

如果三个字母每次都不同,则可以使用切片表示法:

your_string = "ABC123"
your_string[3:]
>>> '123'
或者如果前缀每次都相同

your_string = "zzz123"
your_string.lstrip("zzz")
>>>> '123'

要删除每个项目的前3个字符,可以使用列表切片,如下所示:

my_list = ['zzz143', 'zzz146', 'zzz150']

new_list = [item[3:] for item in my_list]
输出:


要删除每个项目的前3个字符,可以使用列表切片,如下所示:

my_list = ['zzz143', 'zzz146', 'zzz150']

new_list = [item[3:] for item in my_list]
输出:


如果您需要从文件名中提取数字以编制索引,那么文件名有多重要,您可以使用:

>>> import re
>>> s = '250.zzz'
>>> s1 = 'zzz123'
>>> s2 = 'abc.444.zzz' 
>>>
>>> re.search(r'\d+', s).group(0)
'250'
>>> 
>>> re.search(r'\d+', s1).group(0)
'123'
>>>
>>> re.search(r'\d+', s2).group(0)
'444
编辑,这将适用于您提到的所有文件名情况:

def get_list(path, path_of_module_files):
    onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
    d = {}
    for fil in onlyfiles:
        seq = re.search(r'\d+', fil) 
        if seq:       
            d[seq.group(0)] = os.path.abspath(fil)
EDIT2:您还可以使用以下功能执行此操作:

>>> onlyfiles
['250.zzz', 'zzz123', 'abc.444.zzz']
>>> 
>>> list(map(lambda s: re.search(r'\d+', s).group(0), onlyfiles))
['250', '123', '444']
但是,同样,如果您只有以下格式的文件名:“zzz123.ext”,那么您不需要使用re.search使流程过载,最好使用内置方法以加快流程,如下所示:

>>> onlyfiles = ['zzz123', 'zzz456', 'zzz789']
>>> 
>>> list(map(lambda s: s[3:], onlyfiles))
['123', '456', '789']
>>> 
>>> list(map(lambda s: s.strip('zzz'), onlyfiles))
['123', '456', '789']
此方法将自动循环遍历列表中的所有元素,并需要显式编写for循环

编辑3:使用OrderedICT:

简单for循环:

或将zip和map作为一个线性表达式:

>>> OrderedDict(zip(map(lambda s: int(s.strip('zzz')), onlyfiles), onlyfiles))
OrderedDict([(123, 'zzz123'), (456, 'zzz456'), (789, 'zzz789')])

如果您需要从文件名中提取数字以编制索引,那么文件名有多重要,您可以使用:

>>> import re
>>> s = '250.zzz'
>>> s1 = 'zzz123'
>>> s2 = 'abc.444.zzz' 
>>>
>>> re.search(r'\d+', s).group(0)
'250'
>>> 
>>> re.search(r'\d+', s1).group(0)
'123'
>>>
>>> re.search(r'\d+', s2).group(0)
'444
编辑,这将适用于您提到的所有文件名情况:

def get_list(path, path_of_module_files):
    onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
    d = {}
    for fil in onlyfiles:
        seq = re.search(r'\d+', fil) 
        if seq:       
            d[seq.group(0)] = os.path.abspath(fil)
EDIT2:您还可以使用以下功能执行此操作:

>>> onlyfiles
['250.zzz', 'zzz123', 'abc.444.zzz']
>>> 
>>> list(map(lambda s: re.search(r'\d+', s).group(0), onlyfiles))
['250', '123', '444']
但是,同样,如果您只有以下格式的文件名:“zzz123.ext”,那么您不需要使用re.search使流程过载,最好使用内置方法以加快流程,如下所示:

>>> onlyfiles = ['zzz123', 'zzz456', 'zzz789']
>>> 
>>> list(map(lambda s: s[3:], onlyfiles))
['123', '456', '789']
>>> 
>>> list(map(lambda s: s.strip('zzz'), onlyfiles))
['123', '456', '789']
此方法将自动循环遍历列表中的所有元素,并需要显式编写for循环

编辑3:使用OrderedICT:

简单for循环:

或将zip和map作为一个线性表达式:

>>> OrderedDict(zip(map(lambda s: int(s.strip('zzz')), onlyfiles), onlyfiles))
OrderedDict([(123, 'zzz123'), (456, 'zzz456'), (789, 'zzz789')])


要拆分后缀,可以使用os.path.splitext。请参见此处:您是说您只想从文件名中提取数字进行索引吗?@IronFist是的,我需要从文件名中提取数字进行索引。要拆分后缀,可以使用os.path.splitext。看这里:你是说你只想从文件名中提取数字进行索引吗?@IronFist是的,我需要从文件名中提取数字进行索引。我尝试了你的解决方案,但我得到了空的dict。像这样…我是说。但应用你的解决方案后,我应该得到所有文件名。我哪里做错了?我试过你的解决方案,但我得到的是空的。像这样…我是说。但应用你的解决方案后,我应该得到所有文件名。我哪里做错了?但是你能给我一个例子,这样我就可以在一个目录中的所有文件中实现这一点。我的意思是我有100个前缀相同的文件zzz143……zzz253。。。。。。。这样我就可以为目录中的所有文件自动执行。谢谢你的帮助,我将应用这个解决方案,过一会儿再来。谢谢你的回复“铁拳”我收到了这个。订购的是空的。你能为我的问题中提到的编辑修改你的解决方案吗。虽然我的代码处理前缀和后缀,但我现在需要处理前缀。thanx非常感谢您的帮助。对于初学者,请检查onlyfiles列表的内容,如果它是空的,例如printonlyfiles,并查看是否有任何列表,它们可能是您的问题,thanx将提供答复。我在想办法。就一个小问题。如果目录中有10个以上的文件,并且它可以循环从每个文件中提取数字进行索引,那么您可以编辑您的解决方案吗。谢谢你的帮助。但是你能给我一个例子,这样我就可以对一个目录中的所有文件实现这个功能。我的意思是我有100个前缀相同的文件zzz143……zzz253。。。。。。。这样我就可以为目录中的所有文件自动执行。谢谢你的帮助,我将应用这个解决方案,过一会儿再来。谢谢你的回复“铁拳”我收到了这个。订购的是空的。你能为我的问题中提到的编辑修改你的解决方案吗。虽然我的代码处理前缀和后缀,但我需要
现在处理前缀。thanx非常感谢您的帮助。对于初学者,请检查onlyfiles列表的内容,如果它是空的,例如printonlyfiles,并查看是否有任何列表,它们可能是您的问题,thanx将提供答复。我在想办法。就一个小问题。如果目录中有10个以上的文件,并且它可以循环从每个文件中提取数字进行索引,那么您可以编辑您的解决方案吗。谢谢你的帮助。