2011-07-19 48 views
0

如果我從windows命令行使用filename = argv[n],下面的extract()函數似乎工作正常。如果我使用list(dir)中的文件名列表(使用os.listdir()內置函數從工作目錄中提取文件名),那麼extract()函數將失敗。提取文件名時解析文件的問題os.listdir()爲

input_file.read()將文件名識別爲有效值,但它似乎在date = list(date_match[0])失敗,出現'TypeError:coercing to Unicode:need string or buffer,tuple found'。

看來,os.listdir輸出列表值不是正常的字符串,而是其他的東西。有任何想法嗎?

import sys 
import re 
import os 

def extract(filename): 

    input_file = open(filename, 'r') 
    data = input_file.read() #read file line by line 

    #make list of time and date 
    date_match = re.findall(r'(\d+:\d+)\t(\d+/\d+/\d+)', data) #find file date and time 
    date = list(date_match[0]) 

    #extract date tuple from list above 
    return date 

def list(dir): 
    directoryfiles = os.listdir(dir) 
    diroutput = [] 
    for member in directoryfiles: 
     if member != sys.argv[0]: 
      diroutput.append(member) 
    return diroutput 

def main(): 

    inputfiles = list(sys.argv[1]) 

    for filename in inputfiles: 
     date = extract(filename) 

if __name__ == '__main__': 
    main() 
+1

更改「列表」功能的名稱後再試一次。 'list'是一個內置的python,你不應該重寫這個名字。 – Nate

+0

你是什麼意思,「它似乎os.listdir輸出列表值不是正常的字符串,但別的東西」,你是否嘗試打印值,打印那裏類型例如'print dir,type(dir)',btw'dir'是一個內置命令,不用它作爲變量名 –

+0

如果你只取得第一個結果,也沒有理由使用're.findall()'。只需要執行'date_match = re.search(r'(\ d +:\ d +)\ t(\ d +/\ d +/\ d +)',data); date = filelist(date_match.group ())',其中'filelist'是你的'list'函數的一個更正的名字(因爲'list'是一個Python內建的,不應該像這樣被映射)。 (或者,如果你想在那裏使用內建'list',只需重命名你的'list'函數並保持'list'的使用。) – JAB

回答

4

您已重新定義list!當您嘗試執行date = list(date_match[0])時,您正在呼叫list功能,而不是內置list功能。重命名列表函數,它應該工作正常。

+0

謝謝。我認爲這是一個'沒有看到樹木的情況' –