首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取文件夹中文件的序列号?

如何获取文件夹中文件的序列号?
EN

Stack Overflow用户
提问于 2012-08-02 16:45:19
回答 3查看 1.2K关注 0票数 2

我有Windows PC。我的脚本应该标识文件夹中命令行中传递的文件的顺序号,即

代码语言:javascript
复制
myscript.py \\network-drive\files\Long-long.file.name.with.numbers.txt

文件夹内容如下:

代码语言:javascript
复制
\\network-drive\files\
    folder1
    folder2
    file1
    file2
    Long.long.file.name.with.numbers.txt
    file3
    file4

我的脚本应该标识命令行中给出的文件的序列号,即应该返回5(文件夹也要计数;假定文件是按其名称排序的)。

Upd.我已经停止了以下几点:

代码语言:javascript
复制
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返回的列表不允许我识别什么是文件夹,什么是文件。所以,我不能把它们正确地分类。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-02 17:11:00

看起来像这样的东西应该能工作:

代码语言:javascript
复制
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"
票数 1
EN

Stack Overflow用户

发布于 2012-08-02 18:08:01

有几个问题,你正试图解决,和几个解决方案的选择。

第一,你是在寻找自然排序的东西吗?

代码语言:javascript
复制
/path/to/folder/
  subfolder01/
  test1.png
  test2.png
  test3.png
  test10.png
  test11.png

如果是这样的话.你需要创建一个自然排序方法。如果您对alpha-数字排序很满意:

代码语言:javascript
复制
/path/to/folder/
  subfolder01/
  test1.png
  test10.png
  test11.png
  test2.png
  test3.png

那么标准的排序就可以了。根据对文件进行排序的方式,结果的索引将有所不同。

要从系统中获取目录和文件,您可以使用两种方法之一--而不是100%确定哪个更快,所以将它们都测试出来。我要把答案分成几个部分,这样你就可以把它拼凑在一起,看上去最合适了:

第01部分:初始化

代码语言:javascript
复制
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

代码语言:javascript
复制
files   = []
folders = []
for filepath in os.listdir(basepath):
    if ( os.path.isfile(filepath) ):
        files.append(filepath)
    else:
        folders.append(folder)

备选案文2: os.walk

代码语言:javascript
复制
# 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:不进行排序--从系统中得到的就是得到的

代码语言:javascript
复制
# no sorting
try:
    index = len(folders) + files.index(searchname)
except IndexError:
    index = -1

选项2:字母数字排序

代码语言:javascript
复制
# sort alpha-numerically (only need to sort the files)
try:
    index = len(folders) + sorted(files).index(searchname)
except IndexError:
    index = -1

选项3:自然排序

代码语言:javascript
复制
# 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部分:记录结果

代码语言:javascript
复制
# if wanting a 1-based answer
index += 1
print index

我不打算详细讨论自然排序,因为这不是问题的一部分-我想这里还有其他论坛,你可以找到关于这方面的建议。projex.sorting模块是我编写的一个模块,如果您想要查看它的确切实现,可以在这里获得:http://dev.projexsoftware.com/projects/projex

可以说,这将是结果的差异:

代码语言:javascript
复制
>>> 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']

所以当你使用它的时候要记住这一点。

干杯!

票数 3
EN

Stack Overflow用户

发布于 2012-08-02 17:09:44

代码语言:javascript
复制
from os import listdir
from sys import argv
from os.path import *
print listdir(dirname(argv[1]).index(basename(argv[1]))

但它真的毫无意义,甚至无法想象当你需要它的时候使用它。详情请参见os.path

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11782109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档