

python のフォルダの書き込み順に関してお聞きしたいのですが、  
以下のサンプルを実行しますと、

[code]

    import os
    
    def asxmake(srcDir):
        for sub in os.listdir(srcDir):
            newSrcPath = os.path.join(srcDir, sub)
            if os.path.isdir(newSrcPath):
                f = open(AsxMake, 'a+')
                print >>f, sub
                print sub
                asxmake(newSrcPath)
    
            else:
                f = open(AsxMake, 'a+')
                file = sub.replace('/','\\')
                filename = os.path.basename(file)
                print >>f, sub
                print sub
    
    srcDir = 'C:\\temp\\test'
    AsxMakefol = 'C:\\temp\\test'
    AsxMake = 'C:\\temp\\test\\1.asx'
    asxmake(srcDir)
    
[/code]

書き込まれたファイルを確認してみると、

（一番上の階層は、01.txt 02.txt  
00フォルダ構造の中に03.txt 04.txtがある状態でテストしています。）

03.txt  
04.txt  
00  
01.txt  
02.txt  
となってしまいます。

print文で確認すると処理順は以下のようになっている  
のですが、  
00  
03.txt  
04.txt  
01.txt  
02.txt  
何が原因で順番が変わってしまうのでしょうか？

program初心者のため、解決策を見出せません。  
ご教授の程よろしくお願いいたします。


CC BY-SA 3.0
2015-07-14T11:10:49.807
12344
2015-07-15T01:30:16.260
2015-07-14T11:38:33.390
8000
10527
question
python
python のフォルダの書き込み順に関しまして


ファイルはバッファリングしていることを念頭に置くと理解しやすいです。  
バッファリングとは、ファイルに書き出す前にメモリに貯めておき、一定量たまったら、またはファイルがクローズされたら、ファイルに書き出します。

今回は、再帰しているので、再帰の中で出力したものが先に書きだされます。

[code]

    00 => バッファ1
      03.txt => バッファ2
      04.txt => バッファ2         
      バッファ2書き出し
    01.txt => バッファ1
    02.txt => バッファ1
    バッファ1書き出し
    
[/code]

バッファ2、バッファ1の順番で書き出されるので、記載どおりの結果になります。  
コレを解消するには、一つには、flush を使う方法があります。

[code]

    def asxmake(srcDir):
        for sub in os.listdir(srcDir):
            newSrcPath = os.path.join(srcDir, sub)
            if os.path.isdir(newSrcPath):
                f = open(AsxMake, 'a+')
                print >>f, sub
                f.flush()
                print sub
                asxmake(newSrcPath)
            else:
                f = open(AsxMake, 'a+')
                file = sub.replace('/','\\')
                filename = os.path.basename(file)
                print >>f, sub
                f.flush()
                print sub
    
[/code]

しかしながら、ファイルを毎回開かない、かつ、walk を使うほうが楽な気がします。


CC BY-SA 3.0
2015-07-14T12:06:01.463
12347
2015-07-14T12:06:01.463
7471
12344
answer


ファイルを一度開いたら、同じファイルハンドラを使って書き込むようにすれば解決できます。

[code]

    import os
    
    def asxmake(f, srcDir):
        for sub in os.listdir(srcDir):
            newSrcPath = os.path.join(srcDir, sub)
            if os.path.isdir(newSrcPath):
                print >>f, sub
                asxmake(f, newSrcPath)
    
            else:
                file = sub.replace('/','\\')
                filename = os.path.basename(file)
                print >>f, sub
    
    srcDir = 'C:\\temp\\test'
    AsxMakefol = 'C:\\temp\\test'
    AsxMake = 'C:\\temp\\test\\1.asx'
    
    with open(AsxMake, 'w') as f:
        asxmake(f, srcDir)
    
[/code]


CC BY-SA 3.0
2015-07-15T01:30:16.260
12361
2015-07-15T01:30:16.260
7837
12344
answer