如何解决按顺序对要上传的文件列表进行排序
我的目标是让 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
不能就地工作。如果要将更改传播回 subFolder
,os.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
的调用无效。您通常希望在循环序列之前应用排序,如上所示。
使用 pathlib 和 sorted 可以大大简化整个循环:
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 举报,一经查实,本站将立刻删除。