2012-03-07 83 views
0

我的代碼應該得到最後修改後的文件並在屏幕上打印,直到它保持運行,直到一個新文件被修改並將其打印到屏幕上,但我肯定會得到一個typeError。 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

您的縮進可能是錯誤的。你能糾正它嗎? – 2012-03-07 17:44:19

+0

當我刪除newfiles + =打開(文件,'r') 在新文件中的k: sys.stderr.write(k)並把新文件+ = 1它打印底部的打印聲明 – mintgreen 2012-03-07 17:50:58

+3

我認爲@SvenMarnach指的是「if」塊的縮進。他們看起來應該是在「for」循環中。此外,你擁有的邏輯不會完全符合你的描述。它將循環所有文件一次,然後停止。爲了讓我們更容易,錯誤會引發什麼?最後,我認爲你的意思是'dir_path'是一個參數,而不是字符串文字。 – 2012-03-07 17:57:00

回答

1

代碼中有幾件事看起來很奇怪。例如:

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

這真的是你想要的嗎?點匹配除換行符以外的任何字符。您可能需要將其轉義才能獲得所需的行爲,或者您可以僅使用f.endswith('.csv')進行測試。

files.sort 

這不是函數調用。它應該是files.sort()

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

這是更好地使用os.path.join()加入目錄路徑和文件名。

newfiles += open(files, 'r') 

files變量是一個列表,而不是一個字符串,對不對?你不在這條線上發生錯誤嗎?

+0

是的,我這樣做,我得到它 – mintgreen 2012-03-07 18:10:50

+0

@mintgreen:好的,從'文件'更改爲'文件',然後檢查會發生什麼。 – 2012-03-07 18:13:16

+0

發生這種情況IOError:[Errno 2]沒有這樣的文件或目錄:'21B8A1E8c.csv' – mintgreen 2012-03-07 18:40:36

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

好的謝謝,但他們有一個問題,它打印的文件名和文件位於內存時,它應該打印文件的內容? – mintgreen 2012-03-07 18:28:16

+0

@mintgreen現在'sys.stderr.write(k.read())'會讀取整個文件,然後將其寫入標準錯誤。 – macduff 2012-03-07 18:44:32

+2

如果要打印內容而不是文件的字符串表示形式,則必須獲取內容。正如@macduff所說,這意味着使用'k.read()'而不是'k'。也就是說,我會提醒不要將整個文件轉儲到stderr,因爲這些文件可能很大。 – 2012-03-07 18:46:58