如果我從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()
更改「列表」功能的名稱後再試一次。 'list'是一個內置的python,你不應該重寫這個名字。 – Nate
你是什麼意思,「它似乎os.listdir輸出列表值不是正常的字符串,但別的東西」,你是否嘗試打印值,打印那裏類型例如'print dir,type(dir)',btw'dir'是一個內置命令,不用它作爲變量名 –
如果你只取得第一個結果,也沒有理由使用'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