2013-03-14 44 views
0

我有一個目錄有一堆子目錄,每個子目錄有很多csv文件,但我只對某些csv文件感興趣。所以我寫了下面的Python方法,但我無法捕捉到的文件名,如果我不* .csv文件它會發現所有的文件,但我不想把所有的文件中讀取:python fnmatch無法找到文件

def gatherStats(template_file, csv_file): 
    for lang in getLanguageCodes(csv_file): 
     lang_dir = os.path.join(template_file, lang) 
     try: 
      for file in os.listdir(lang_dir): 
       if fnmatch.fnmatch(file, '*-*-template-users-data.csv'): 
        t_file = open(file, 'rb').read() 
        reader = csv.reader() 
        for row in reader: 
         print row 
       else: 
        print "didn't find the file" 
     except Exception, e: 
      logging.exception(e) 

我在這裏做錯了什麼?這是一個正則表達式問題嗎?我們可以用fnmath使用正則表達式嗎?

+0

你能分享一些應該匹配的文件名的例子嗎?我無法重現您的問題。 – 2013-03-14 17:58:20

+0

我建議的一個改變是將你的'else:'語句改爲:'print'文件%s不匹配「%file',如果你的打印語句不打印,那麼你可能試圖列出內容錯誤的目錄。 – 2013-03-14 18:13:49

回答

0

在另一個用戶提供的幫助下,我設法解決了這個問題。我將這個答案放在這裏供社區日後參考。

def gatherStats(template_file, csv_file): 
    for lang in getLanguageCodes(csv_file): 
     lang_dir = os.path.join(template_file, lang) 
     try: 
      for filename in os.listdir(lang_dir): 
       path = os.path.join(lang_dir, filename) 
       if re.search(r'-.+-template-users-data.csv$',filename): 
        with open(path, 'rb') as template_user_data_file: 
         reader = csv.reader(template_user_data_file) 
         try: 
          for row in reader: 
           print row 
         except csv.ERROR as e: 
          logging.error(e) 
       else: 
        print "didn't find the file" 
     except Exception, e: 
      logging.exception(e) 
1

您的代碼有幾個問題。先解決它們,然後我們可能會發現問題的真相。

  • 首先,不要使用內置名稱作爲變量,如file。而是用filename替換它。
  • 然後在打開文件之前os.path.join(lang_dir, filename)。含義:

    t_file = open(os.path.join(lang_dir, filename), 'rb').read() 
    
  • 你怎麼能指望reader = csv.reader()閱讀您的文件,如果你不引用您打開的文件對象在這一行?

  • 您的try/except區塊對我來說太寬了。慢慢來,縮小實際發生的錯誤。然後決定你想忽略哪一個,哪個應該會導致你的程序崩潰。仔細看看這個塊中實際拋出的異常。你可能會在那裏發現你的問題。
+0

感謝您的想法,但這實際上並沒有提供答案,所以我不得不投票。我設法解決這個問題,並在不同用戶提供的答案的幫助下清理我的代碼。但一些我怎麼看不到這個答案了。 – 2013-03-14 20:13:13

+0

很高興我能幫到你(你跟着我的三個指針)。 'fnmatch'不是你的問題:'從fnmatch import fnmatch','test =「AAA-BBB-template.csv」','fnmatch(test,'* - * - template.csv')' - >'True '。 Martijn Pieters已經指出了這一點。 – 2013-03-15 11:59:58