用0的python填充一个范围

2024-05-23 23:07:09 发布

您现在位置:Python中文网/ 问答频道 /正文

关于python中globbing的快速问题。在

我有一个文件目录,目录是“sync_0001.tif”、“sync_0002.tif”。。。,“sync_2400.tif”。第一个800个文件,第二个是800个文件。唯一的问题是数字前的0。我想不出正确的方法去寻找那些名单。第三个列表很简单,因为没有0填充任何这些文件(s3=环球网('sync\[1601-2400].tif')。另外两个比较棘手,因为前面0的数目不同。在

我试过了,但得到了“坏字符范围”,我猜是因为0:

s1 = glob.glob('sync_' + '{[0001-0009], [0010-0099], [0100-0800]}' + '.tif')
s2 = glob.glob('sync_' + '{[0801-0999], [1000-1600]}' + '.tif')

然后我试着把0移到前面,但是得到了一个空列表:

^{pr2}$

实现这三个清单的最佳方法是什么?我开始觉得我搞错了,所以如果有人能给我点启示那就太好了。谢谢!在


Tags: 文件方法目录列表s3数字syncglob
2条回答

最好的方法是:

  1. Glob以sync开头的所有文件
  2. 按数字组件对列表排序
  3. 把它分成800块

既然你已经了解了globbing,剩下的就是:

import glob
import re
from itertools import izip_longest

# https://docs.python.org/2/library/itertools.html#recipes
def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x')  > ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)


def sorter(x):
    return int(re.search('(\d+)',x).groups()[0])

files = glob.glob('sync*.tif')
sorted_files = sorted(files, key=sorter)
in_batches = list(grouper(sorted_files, 800))

由于模式始终是sync_(在您编辑之后),您可以将上面的代码简化为以下内容:

^{pr2}$

支持glob.glob()函数的^{} module对于您的任务来说还不够复杂。在

只需抓取所有文件名并在排序后对其进行分区:

filenames = sorted(glob.glob('sync_[0-9][0-9][0-9][0-9].tif'))

这是因为你的数字是填充的,因此可以按字典顺序排序。然后把它们分开:

^{pr2}$

无论如何,目录I/O将是这里最慢的。通过只循环一次并交换附加到的内容,可以使这一切变得更加高效:

target = s1 = []
s2 = []
s3 = []
for f in filenames:
    num = int(f[5:9])
    if num > 800:
        target = s2
    elif num > 1600:
        target = s3
    target.append(f)

但对于这样的任务,坚持简单的清单理解也很好。在

相关问题 更多 >