2

私はWindowsPCを持っています。私のスクリプトは、フォルダ内のコマンドラインで渡されたファイルのシーケンス番号を識別する必要があります。

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フォルダとファイルを識別できません。そのため、正しく並べ替えることができません。

4

3 に答える 3

3

あなたが解決しようとしているいくつかの問題と、解決策のためのいくつかのオプションがあります。

1番目-自然にソートされたものを探していますか?

/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

その後、標準の並べ替えが機能します。ファイルの並べ替え方法に応じて、結果のインデックスは異なります。

システムからディレクトリとファイルを取得するには、2つの方法のいずれかを実行できます。どちらが高速か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']

ですから、それを扱うときはそれを覚えておいてください。

乾杯!

于 2012-08-02T18:08:01.180 に答える
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"
于 2012-08-02T17:11:00.220 に答える
0
from os import listdir
from sys import argv
from os.path import *
print listdir(dirname(argv[1]).index(basename(argv[1]))

しかし、それは実際には何の意味もありません。必要なときにユースケースを想像することすらできません。詳細os.pathはをご覧ください。

于 2012-08-02T17:09:44.353 に答える