我有Windows PC。我的脚本应该识别文件夹中命令行传递的文件的顺序号,即
myscript.py \\network-drive\files\Long-long.file.name.with.numbers.txt
文件夹内容如下:
\\network-drive\files\
folder1
folder2
file1
file2
Long.long.file.name.with.numbers.txt
file3
file4
我的脚本应该识别命令行中给出的文件的序列号,即应该返回5(文件夹也要计算;假设文件按名称排序)。
UPD 即可。我已经停止了以下内容:
import sys
import os.path
if sys.argv[1]: # regardless of this verification, exception happens if argument is not passed
head, tail = os.path.split(sys.argv[1])
print head
print os.listdir(head)
listdir
返回的列表不允许我识别文件夹和文件是什么。所以,我无法正确地对它们进行排序。
答案 0 :(得分:3)
您正试图解决几个问题,以及解决方案的几个选项。
1st - 你在寻找自然分类的东西,即:
/path/to/folder/
subfolder01/
test1.png
test2.png
test3.png
test10.png
test11.png
如果是这样......你需要创建一个自然的排序方法。如果您对字母数字排序感到满意:
/path/to/folder/
subfolder01/
test1.png
test10.png
test11.png
test2.png
test3.png
然后标准排序将起作用。根据您对文件的排序方式,结果的索引会有所不同。
要从系统中获取目录和文件,您可以采用以下两种方法之一 - 不是100%确定哪种方式更快,因此请将它们全部测试。我打算把答案分成几块,这样你就可以把它拼凑起来,看起来最合适:
第01部分:初始化
import os
import sys
try:
searchpath = sys.argv[1]
except IndexError:
print 'No searchpath supplied'
sys.exit(0)
basepath, searchname = os.path.split(searchpath)
第02部分:收集文件夹和文件
选项#1:os.listdir + os.path.isfile
files = []
folders = []
for filepath in os.listdir(basepath):
if ( os.path.isfile(filepath) ):
files.append(filepath)
else:
folders.append(folder)
选项#2:os.walk
# we only want the top level list of folders and files,
# so break out of the loop after the first result
for basepath, folders, files in os.walk(basepath):
break
第03部分:计算指数
选项#1:没有排序 - 你从系统得到的是你得到的东西
# no sorting
try:
index = len(folders) + files.index(searchname)
except IndexError:
index = -1
选项#2:字母数字排序
# sort alpha-numerically (only need to sort the files)
try:
index = len(folders) + sorted(files).index(searchname)
except IndexError:
index = -1
选项#3:自然排序
# natural sort using the projex.sorting.natural method
import projex.sorting
sorted_files = sorted(files, projex.sorting.natural)
try:
index = len(folders) + sorted_files.index(searchname)
except IndexError:
index = -1
第04部分:记录结果
# if wanting a 1-based answer
index += 1
print index
我不打算详细介绍自然排序,因为这不是问题的一部分 - 我认为这里有其他论坛你可以找到建议。 projex.sorting模块是我编写过的模块,可以在这里找到:http://dev.projexsoftware.com/projects/projex如果你想看到它的确切实现。
可以说这将是结果的差异:
>>> import pprint, projex.sorting
>>> files = ['test2.png', 'test1.png', 'test10.png', 'test5.png', 'test11.png']
>>> print files.index('test10.png')
2
>>> print sorted(files).index('test10.png')
1
>>> print sorted(files, projex.sorting.natural).index('test10.png')
3
>>> print files
['test2.png', 'test1.png', 'test10.png', 'test5.png', 'test11.png']
>>> print sorted(files)
['test1.png', 'test10.png', 'test11.png', 'test2.png', 'test5.png']
>>> print sorted(files, projex.sorting.natural)
['test1.png', 'test2.png', 'test5.png', 'test10.png', 'test11.png']
所以当你使用它时,请记住这一点。
干杯!
答案 1 :(得分:1)
看起来这样的事情应该有效:
import os
import glob
import sys
import os.path as path
try:
directory,file = path.split( sys.argv[1] )
def sort_func(fname):
"""
Russian directories , english directories, russian files then english files
although, honestly I don't know how russian files will actually be sorted ...
"""
fullname = path.join(directory,fname)
isRussian = any(ord(x) > 127 for x in fullname)
isDirectory = path.isdir(fullname)
return ( not isDirectory, not isRussian, fullname)
files = sorted( os.listdir(directory), key=sort_func)
print ( files.index(file) + 1 )
except IndexError:
print "oops, no commandline arguments"
答案 2 :(得分:0)
from os import listdir
from sys import argv
from os.path import *
print listdir(dirname(argv[1]).index(basename(argv[1]))
但它确实没有任何意义,甚至无法想象在你需要时使用它。有关详细信息,请参阅os.path
。