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

时间:2017-01-17 12:11:56

标签: python text

我必须通过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。我必须通过删除zzz来获取文件名,列表应该是这样的

143
146
150
.
.
. 
250

而不是

zzz143
zzz144
zzz145
.
.
. 
.
zzz250

如果有人给我一个想法或示例如何通过循环获取所有文件名以提取该目录中的所有文件。我真的很感激

4 个答案:

答案 0 :(得分:3)

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

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

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

<强>输出:

>>> new_list
['143', '146', '150']

答案 1 :(得分:2)

如果您确定前缀为'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]))

答案 2 :(得分:2)

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

your_string = "ABC123"
your_string[3:]
>>> '123'

如果前缀每次都相同,则为string.lstrip

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

答案 3 :(得分:2)

如果您需要从文件名中提取数字以进行索引,那么文件名是多么重要,您可以这样做:

>>> 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:你也可以使用map功能:

>>> onlyfiles
['250.zzz', 'zzz123', 'abc.444.zzz']
>>> 
>>> list(map(lambda s: re.search(r'\d+', s).group(0), onlyfiles))
['250', '123', '444']

但是,如果您拥有的是具有此格式的文件名:&#39; zzz123.ext&#39;,那么您不需要使用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循环。

EDIT3:使用OrderedDict:

简单for循环:

>>> from collections import OrderedDict
>>>
>>> index_dict = OrderedDict()
>>>  
>>> for fil in onlyfiles:
        k = int(fil.strip('zzz'))
        index_dict[k] = fil

>>> index_dict
OrderedDict([(123, 'zzz123'), (456, 'zzz456'), (789, 'zzz789')])

zipmap作为一个班轮表达式:

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