使用Python对文件进行排序natsort并将其保存到文件

使用Python对文件进行排序natsort并将其保存到文件,python,python-3.x,Python,Python 3.x,我是python的新手,需要用文件对列表进行反向排序。我在谷歌上搜索了很多,似乎natsort为我的问题提供了解决方案 我找到了证据,但我没能把它应用到我的案件中。我在search_results.txt中有一个列表,我想用natsort对它进行排序 Input: C:/Test/XY2019_00.zip C:/Test/XY2019_01-04.zip C:/Test/XY2019_01.zip C:/Test/XY2019_01-03.zip C:/Test/XY2019_01-02.z

我是python的新手,需要用文件对列表进行反向排序。我在谷歌上搜索了很多,似乎natsort为我的问题提供了解决方案

我找到了证据,但我没能把它应用到我的案件中。我在search_results.txt中有一个列表,我想用natsort对它进行排序

Input:
C:/Test/XY2019_00.zip 
C:/Test/XY2019_01-04.zip
C:/Test/XY2019_01.zip
C:/Test/XY2019_01-03.zip
C:/Test/XY2019_01-02.zip
C:/Test/XY2019_01-01.zip

Output with normal sort (reverse = True):
C:/Test/XY2019_01.zip
C:/Test/XY2019_01-04.zip
C:/Test/XY2019_01-03.zip
C:/Test/XY2019_01-02.zip
C:/Test/XY2019_01-01.zip
C:/Test/XY2019_00.zip


desired result:
C:/Test/XY2019_01-04.zip
C:/Test/XY2019_01-03.zip
C:/Test/XY2019_01-02.zip
C:/Test/XY2019_01-01.zip
C:/Test/XY2019_01.zip
C:/Test/XY2019_00.zip

您的问题不是排序算法,而是.z在-0之后。扩展名是字符串的一部分,这可能会打乱排序顺序

为了防止这种情况发生,您必须在排序之前从文件名中删除.zip扩展名。您可以将不带扩展名的文件名存储在与正确的文件名相同的列表中,并对其进行压缩排序,以便最终只提取真实的文件名:

flist = []
for f in filenames:
    flist.append((f[:-4],f))

filesorted = list(zip(*sorted(flist,reverse=True)))[1]
然后,排序的列表文件包含正确的顺序。 如果您的文件夹包含扩展名超过4个字符的文件,例如.xlsx,您可能需要使用比f[:-4]更复杂的Truncutation,但它应该可以正常工作。

我现在解决了它:

def sorting ():
    from natsort import os_sorted

    paths = list()
    # read results from file
    filename = 'search_results.txt'
    with open(filename) as f:
        for line in f:
            paths.append(line.strip())


    results = os_sorted(paths, reverse=True)

    filename = 'search_results.txt'
    with open(filename, 'w') as f:
        for result in results:
            f.write(result + '\n')


我认为natsort只是解决了.z之前出现的问题。-an适用于所有扩展。安威。我应该只有3个字符。然而不幸的是,它不起作用。它在列表中只写了一个看似随机的字母。列表:'['x','u','t','t','t','s','s','r','r','l','h','e','e','c','a','u'','.]'我假设在一个名为文件名的列表中,文件名是字符串。很抱歉没有提及此事。看起来,你只是在循环中加入了一个字符串。该代码适用于任何字符串列表,其中排序时不应考虑字符串的最后四个字符,例如.zip。所以,是的:它适用于所有扩展。
flist = []
for f in filenames:
    flist.append((f[:-4],f))

filesorted = list(zip(*sorted(flist,reverse=True)))[1]
def sorting ():
    from natsort import os_sorted

    paths = list()
    # read results from file
    filename = 'search_results.txt'
    with open(filename) as f:
        for line in f:
            paths.append(line.strip())


    results = os_sorted(paths, reverse=True)

    filename = 'search_results.txt'
    with open(filename, 'w') as f:
        for result in results:
            f.write(result + '\n')