2012-03-07 8 views
0

新しいファイルが変更されて画面に出力されるまで、実行中に最後に変更されたファイルを取得して印刷することになっていました。 TypeError:Unicodeに強制する:必要な文字列またはバッファー、intが見つかりました。ディレクトリ内のトラフファイルを反復する

import os, sys, re, time 
from datetime import date, timedelta, datetime 
from time import localtime 

files = os.listdir('dir_path') 

files = [f for f in files if re.search('.csv', f, re.I)] 
files.sort 

d = datetime.now() - timedelta(days = 30) 
d = d.timetuple() 

oldfiles = 0 
newfiles = 0 
for file in files: 
    filetimesecs = os.path.getmtime('dir_path' + file) 
    filetime = localtime(filetimesecs) 

if filetime < d: 
    oldfiles += 1 
if filetime > d: 
    newfiles += open(files, 'r') 
    for k in newfiles: 
     sys.stderr.write(k) 
    while True: 
     time.sleep(2) 
     print"new: %s" % newfiles 
+3

あなたのインデントが間違っている可能性があります。それを修正してください。 –

+0

いいえnewfiles + = open(ファイル、 'r')を削除する場合 k:newfiles: sys.stderr.write(k)とput newfiles + = 1 print文を最下部に表示します – mintgreen

+3

@SvenMarnach 'if'ブロックのインデントを参照しています。彼らは 'for'ループ内にあるように見えます。また、あなたが持っている論理は、あなたの記述が言っていることを全くしません。すべてのファイルを1回ループして停止します。そして、私たちをより簡単にするために、エラーはどんな行為に投げかけられていますか?最後に、 'dir_path'が文字列リテラルではなくパラメータになることを意味すると思います。 –

答えて

1

コード内には、奇妙に見えるものがいくつかあります。例:

files = [f for f in files if re.search('.csv', f, re.I)] 

これは本当に必要なものですか?このドットは、改行を除く任意の文字に一致します。あなたはおそらく、望ましい動作を得るためにそれをエスケープする必要がありますか、代わりにf.endswith('.csv')でテストすることができます。

files.sort 

これは関数呼び出しではありません。ディレクトリ・パスとファイル名を結合するためにos.path.join()を使用することをお勧めしfiles.sort()

filetimesecs = os.path.getmtime('dir_path' + file) 

でなければなりません。

newfiles += open(files, 'r') 

files変数はリストであり文字列ではありません。この行に誤りはありませんか?

+0

はい私はそれをどこで得るのですか – mintgreen

+0

@mintgreen:OK、「ファイル」から「ファイル」に変更して何が起こるかを確認してください。 –

+0

IOError:[Errno 2]このようなファイルやディレクトリはありません: '21B8A1E8c.csv' – mintgreen

1

私たちはいくつかのタイプのエラーがあるようですが、私はこれをできる限り上にクリアしようとします。

oldfiles = 0 
# if newfiles is an integer, I'm not sure that it will be 
# as helpful to you, I think you'd really rather have a list 
newfiles = list() 
for file in files: 
    filetimesecs = os.path.getmtime('C:/tmp/' + file) 
    filetime = localtime(filetimesecs) 
    if filetime < d: 
     oldfiles += 1 
    if filetime > d: 
     newfiles.append(open('C:/tmp/' + file, 'r')) 
     for k in newfiles: 
      # read the entire file and write it to standard error 
      sys.stderr.write(k.read()) 

# I believe you want the while out here, after everything is complete 
# it would seem that you would want the newfiles loop within the first 
# for loop 
while True: 
    time.sleep(2) 
    print "new: %s" % newfiles 

希望の値です。

+0

okありがとうございます。ファイルの内容を印刷する必要がある場合、ファイル名とファイルがメモリ内のどこに印刷されていますか? – mintgreen

+0

@mintgreen 'sys.stderr.write(k.read())'はファイル全体を読み込み、それを標準エラーに書き込みます。 – macduff

+2

ファイルの文字列表現ではなく内容を印刷する場合は、内容を取得する必要があります。 @macduffが示唆するように、それは単に 'k'の代わりに' 'k.read()'を使うことを意味します。つまり、ファイル全体を標準エラー出力にダンプすることには注意が必要です。 –

関連する問題