2016-04-04 13 views
2

2つのサブフォルダを含むルートフォルダを歩き回り、そのいずれかのサブフォルダに移動してファイルをソートし、ソートされたファイルの最初のものに対してのみ別の機能を実行し、残りのフォルダで同じことをします。ここまでは私のコードですが、うまくいきません。 AppendFiles関数は実行されません。このセクションの最後にトレースバックを置くと、エラーは発生しません。os.walkを使用してファイルをソートし、フォルダ内の最初のファイルでのみ関数を実行します

x=0 
y=0 
errorFiles={} 
datadir = 'C:/root/path' 

for root, dirs, files in os.walk(datadir): 
    for dirname in dirs: 
     for filename in sorted(files, key=int): 
      name = filename[:-4] 
      file = datetime.strptime(name, "%y%m%d%H") 
      (x,errorFiles) = AppendFiles(file,datadir,dirname,x,y,errorFiles) 
      if x==0: 
       pass 
      else: 
       print("The following" + dirname + " files experienced a Decoding Error:\n") 
       for i in range(x): 
        print(errorFiles[i] + "\n") 
       break 

name = filename[:-4]部分は、それが私の機能で素晴らしいプレーしますので、最後に.csvのファイル名を除去するだけです。私はここからどこに行くべきかわからない、すべての助けに感謝!

逆の質問ですが、(x,errorFiles)の行に正しい構文がありますか? AppendFiles()(a,b)を返します。bは配列です。

+0

'os.walk'は3タプルを返します。最初のメンバはカレントディレクトリで、ウォークされたディレクトリごとに1回だけ返されます。 – tripleee

答えて

4

主な回答:os.walk(強調鉱山)用

(部分)ドキュメント:

os.walk

内のファイル名を生成します(トップ、。。。)ツリーをトップダウンまたはボトムアップで歩いてディレクトリツリーを作成します。ディレクトリtop(ルート自体を含む)をルートとするツリー内の各ディレクトリに対して、は、3タプル(dirpath, dirnames, filenames)を生成します。

dirpathは文字列で、ディレクトリへのパスです。

dirnamesdirpath内のサブディレクトリの名前のリストです( '' と '..' は除きます)。

filenamesは、ディレクトリ以外のファイルの名前のリストです。dirpathです。

リストの名前にはパスコンポーネントが含まれていないことに注意してください。 dirpathのファイルまたはディレクトリへのフルパス(topで始まる)を取得するには、os.path.join(dirpath、name)を実行します。

だから、あなたの最初の行は

for dirname, dirs, files in os.walk(datadir): 

をお読みくださいとファイルがdirnameのためのものであるので、その下に、あなたはdirsに、各ディレクトリ用のファイルを反復処理しないようにしたくない - 彼ら」次の反復で彼らのターンを得るでしょう。

例が役立ちます。あなたがこれを持っていた場合:

その後、
./ 
|-- a.txt 
|-- b.text 
|-- .swp 
| 
|-- mno/ 
| |-- f 
| |-- k 
| `-- p 
`-- xyz/ 
    |-- e 
    |-- h 
    `-- w 

os.walk('.')は返します:

dirname |  dirs  |   files 
---------+------------------+----------------------------- 
'.'  | ['xyz', 'mno'] | ['b.text', 'a.txt', '.swp'] 
'./xyz' | []    | ['h', 'e', 'w'] 
'./mno' | []    | ['k', 'f', 'p'] 

os.walk()が何をやろうとしているために適切なツールではありません - それは、すべての子ディレクトリを通過(およびその子、その子どもの子供、...)と、それぞれの子ディレクトリのためにそれが返す見つかっ:

  • 現在の子の名前、
  • その子に
  • 内のすべてのリストをすべてのディレクトリのリストを渡された初期パスからの相対

    datadir = '.' 
    for root, dirs, files in os.walk(datadir): 
        # root = '.' 
        # dirs = ['mno', 'xyz'] 
        # files = ['a.txt', 'b.text', '.swp'] 
        # 
        for dirname in dirs: 
         # dirname = 'mno' 
         for filename in sorted(files, key=int): 
          # filename = '.swp' 
    

    と:私の例のデータを使用して、コードを歩いている子

内のファイルfilename(別名'.swp')は、dirname(別名'mno')に存在するファイルの1つではないことがわかりましたので、残りの部分は無関係です。


あなたは2つのサブフォルダを持って知っているので、ちょうどos.listdir()彼らとそのフォルダ内のファイルが返されますファイル、上の作品。


サイド回答:

は私の構文は(x,errorFiles)ラインで正しいですか? AppendFiles()(a,b)を返します。bは配列です。

はい、この構文が正しいか - x, errorFiles周り() sが不要であり、あなたが書くことができるものの:何をしようとする

x, errorFiles = AppendFiles(file, datadir, dirname, x, y, errorFiles) 
+0

私はこれが私をどのように助けてくれるのか分かりません。私はもっ​​と混乱しているように感じます。ですから、各ディレクトリのファイルを繰り返し処理する必要はありません。理由は...なぜですか?私は2つのサブディレクトリを持つルートディレクトリ(datadir)を持っています。各サブディレクトリについては、ファイルをソートし、最初のファイル名だけを変数に渡す必要があります。私はそれから.csvファイルを取り除いてdatetimeオブジェクトにして、それが私の関数にあるフォルダの名前を渡す必要があります...どうすればいいですか? dirsだけを反復するだけです、あなたは言っていますか? – shilohln

+0

お、ありがとうございます。あなたが何を言っているのか今私は見ることができます。私は、os.listdir()を示唆したとおりに使用します。 – shilohln

1

一行で行うことができます。

{root: sorted(files, key=func)[0] for root, _, files in os.walk(top) if files} 
key機能について

func

def func(filename): 
    return something 
# something that can be used for comparison 
# You are using int() constructor for func(). Can the filename be converted to int? 
# in that case it has to contain only numbers like "23456". 

os.walk()のためのドキュメントを読んでください。それはではありませんあなたが思うようにそれを返します。

+0

だから私はこれを使うならば、それは私が推測する線のために3を置き換えますか?そして、他のすべてのものは 'filename'が' files'に置き換えられて、その下に行きます。また、私のファイルは、末尾の.csvを除いてすべて数字です。 'key = int'はまだ動作しますか? – shilohln

+0

あなたのファイルが '' 1234.csv "'のようなものなら 'func:= lambda x:int(x.rstrip("。csv "))'。それについてのこと。あなたは '{dir1:file1、dir2:file2、...}'を得るでしょう。それがうまくいけば親切に投票してください。 –

+0

それでも動作させるつもりです。私は 'func:= lambda x:int(x.rstrip("。csv "))'が何を意味するのかは分かりません。申し訳ありませんが、私はこれでかなり新しいです。 def func(filename):labmda x:int(x.rstrip( "。csv")) 'のように定義していますか?また、私のコードと比較して、あなたの1行の後の構文ではまだよく分かりません。 – shilohln

関連する問題