使用glob.glob设置顺序

4

当我的脚本打开文件时,我希望能够设置自己的顺序,但是glob.glob默认为随机打开文件。

我有以下文件:'fish.txt''expo.txt''random.txt'

这只是我所有文件的小规模示例,我想设置它们的顺序。

我已经按照正常方式使用glob.glob打开文件。

    #! /usr/bin/env python
    import sys, os, glob
    mylist = ['fish.txt','random.txt', 'expo.txt']
    def sorter(item):
        for item in mylist:
            return item

    for file in sorted(glob.glob('*.txt'), key = sorter):
         print(file)

我的期望输出如下:

fish.txt
random.txt
expo.txt

你希望如何设置顺序?排序? - iz_
3个回答

9
你可以使用 sorted(list) 来对文件名进行排序,然后再对它们进行迭代:
#!/usr/bin/env python
import sys, os, glob

def sorter(item):
    """Get an item from the list (one-by-one) and return a score for that item."""
    return item[1]

files = sorted(glob.glob('*.txt'), key=sorter)
for file in files:
     print(file)

这里按文件名第二个字母排序。根据您需要对文件列表进行排序的方式更改sorter()函数即可。
如果要按字母顺序排序,您不需要使用key=sorter,因为这是使用字符串列表默认行为的sorted()。那么它会变成:
files = sorted(glob.glob('*.txt'))
for file in files:
     print(file)

你为什么要按第二个字符排序呢? - BlackBear
这只是一个可能性的示例。您应该将 sorter() 函数更改为您想要对文件进行排序的算法。如果您只想按字母顺序排序,可以省略 key=sorter 部分。 - user8181134
@BlackBear,谢谢!你能帮我完成这个脚本吗?我有这样的代码(它不起作用): def sorter(item): for item in mylist: return item。我已经按照我想要的顺序创建了mylist[]。 - gusa10
sorter() 函数每次调用只接收一个项目(在这种情况下是一个文件名),而不是整个列表。因此,要按字母顺序排序,它只会返回文件名,这就是为什么您可以从 sorted(...) 函数调用中省略 key=sorter 的原因。 - user8181134
@user8181134 我不想按字母顺序排序,而是想输入自己的顺序。这就是为什么我按照期望的顺序创建了myList = []。我的想法是,如果我读取myList的每个值,每个值将按照它们在列表中出现的顺序读取。 - gusa10
对于自定义排序算法,您的 sorter() 函数应该返回一个数字作为项目的分数。得分最低的项目将放置在列表的第一位。 - user8181134

2
您可以从glob中对条目进行排序。您可以使用默认排序或选择自己的算法:
简单用法:
#! /usr/bin/env python
import sys, os, glob

for file in sorted(glob.glob('*.txt')):
     print(file)

'sorted'手册:https://python-reference.readthedocs.io/en/latest/docs/functions/sorted.html

'sorted'是一个内置函数,可用于对可迭代对象进行排序。它接受一个iterable(例如列表、元组或字符串)作为参数,并返回一个新的已排序列表。

用法示例:


nums = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_nums = sorted(nums)
print(sorted_nums)  # 输出:[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

'sorted'还接受一些可选参数来控制排序行为,如reverse参数可以控制升序或降序排序。


你想要什么样的排序逻辑?你需要在上面的“def sorter()”中实现该逻辑 - 目前它正在以接收到的相同顺序返回项目。 - Sharad
谢谢!我的问题更多地涉及根据我创建的列表的顺序设置自己的顺序。明白吗? - gusa10

0

您可以使用lambda函数sorted(list)来设计自定义排序方法。

mylist = ['fish.txt','random.txt', 'expo.txt']
mylist2 = sorted(mylist, key = lambda x: x[-6:-5])
print(mylist2)

#output:
#['random.txt', 'expo.txt', 'fish.txt']

这将根据字符串的自定义参数对列表进行排序。这将使用第6个字符进行排序。

glob.glob()会给你一个列表,你可以轻松实现这一点。

要从文件夹中读取多个图像。 如果您的文件名称按此顺序排列:files0.txt,file1.txt,file10.txt,file100.txt,file2.txt,则

sorted(mylist, key = lambda x: x[4:-4]) will help you.

你需要存储 sorted() 函数的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接