微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

按顺序对要上传的文件列表进行排序

如何解决按顺序对要上传的文件列表进行排序

我的目标是让 python 将文件从设置目录上传到电报,使用电报上传,按升序。我拥有的脚本似乎无法按顺序上传。它以随机顺序上传文件。我已经使用 sorted 函数无济于事。查看我的脚本,您可以看到我尝试过的一些事情(评论)。我使用 sorted 进行了设置,可以按顺序列出文件,但是在尝试上传时,我无法重新转换我创建的列表并将其排序回字符串,以便 subprocess 可以读取参数。

脚本如下:

import os
import subprocess
import time
#import shutil

Number_Of_Files = 0
#PATH = r'C:\Users\myuser\Downloads' 
PATH = '/home/pi/Public/'

for root,subFolder,files in os.walk(PATH):
    for item in files:
        #Number_Of_Files=Number_Of_Files+1
        fileNamePath = os.path.join(root,item)
        #sorted = sorted(fileNamePath)
        #subprocess.run(['telegram-upload','-f','my_channel',str(sorted)])
        subprocess.run(['telegram-upload',str(fileNamePath)])
        #os.remove(fileNamePath)
        print(fileNamePath)
        #time.sleep(60)
    #else:
        #print(Number_Of_Files)

解决方法

sorted 不能就地工作。如果要将更改传播回 subFolderos.walk 参数必须就地排序。如果你想直接使用 files,你也需要就地排序。否则,您需要使用排序版本:

for root,subFolder,files in os.walk(PATH):
    files.sort()  # This sorts in-place
    subFolder.sort() # If you want sorted directories
    for item in files:
        fileNamePath = os.path.join(root,item)
        subprocess.run(['telegram-upload','-f','my_channel',fileNamePath])

如果你不想就地对这两个列表进行排序,你可以这样写:

for root,files in os.walk(PATH):
    subFolder[:] = sorted(subFolder)  # creates a new list and assigns back to the original
    for item in sorted(files):
        fileNamePath = os.path.join(root,fileNamePath])

在循环中运行 sorted 毫无意义。由于 sorted 每次都会创建一个新列表,并且循环在原始 files 列表上进行,因此您对 sorted 的调用无效。您通常希望在循环序列之前应用排序,如上所示。

,

使用 pathlibsorted 可以大大简化整个循环:

import subprocess
from pathlib import Path

p=Path('/home/pi/Public/')

for fn in sorted((x for x in p.glob('**/*') if x.is_file())):
    print(fn)
    # subprocess.run(['telegram-upload',str(fn)])

glob('**/*') 是一个递归 glob,相当于使用 os.walk,但更易于管理。 (x for x in p.glob('**/*') if x.is_file()) 是只返回文件,不返回目录和文件的推导式。结果已排序,然后您就可以走了...

鉴于此文件夹结构:

.
├── A
│   ├── b.txt
│   ├── d.txt
│   └── y.doc
└── B
    ├── a.txt
    ├── c.txt
    └── x.doc

sorted((x for x in p.glob('**/*') if x.is_file()) 按以下顺序返回文件:

./A/b.txt
./A/d.txt
./A/y.doc
./B/a.txt
./B/c.txt
./B/x.doc

如果您将已排序的推导式更改为 sorted((x for x in p.glob('**/*') if x.is_file()),key=lambda x: x.name),那么您将仅按文件名对同一棵树进行排序:

./B/a.txt
./A/b.txt
./B/c.txt
./A/d.txt
./B/x.doc
./A/y.doc

或者先按后缀排序,然后用 sorted((x for x in p.glob('**/*') if x.is_file()),key=lambda x: (x.suffix,x.name)) 命名:

./B/x.doc
./A/y.doc
./B/a.txt
./A/b.txt
./B/c.txt
./A/d.txt

使用相同的方法,您可以按创建时间、目录名称、扩展名等进行排序...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。