2016-03-30 92 views
2

我試圖將兩個相同的文件拖入不同的數據框中的python,最終目標是比較新文件中添加的內容和從舊內容中刪除的內容。到目前爲止,我有代碼看起來像這樣:Python讀取基於部分名稱和文件時間戳的文本文件

In[1] path = r'\\Documents\FileList' 
     files = os.listdir(path) 

In[2] files_txt = [f for f in files if f[-3:] == 'txt'] 

In[3] for f in files_txt: 
      data = pd.read_excel(path + r'\\' + f) 
      df = df.append(data) 

我還設置一個變量等於當前日期減去一定的天數,我想用拉具有文件日期等於變量:

d7 = dt.datetime.today() - timedelta(7) 

截至目前,我不確定如何做到這一點,作爲文件名的第一個部分始終保持相同,但他們在最後(如添加數字file_03232016然後file_03302016)。我想通過目錄解析文件名的開始部分,並將它添加到數據框,如果它匹配我設置的日期參數。

編輯:我忘了補充說,有時我還需要看看系統日期創建的時間戳,因爲文件名中的文本日期並不總是存在。

回答

1

以下是對原始代碼的一些修改,以獲取包含您的目標日期的文件列表。您需要使用strftime

import os 
from datetime import timedelta 

d7 = dt.datetime.today() - timedelta(7) 
target_date_str = d7.strftime('_%m%d%Y') 

files_txt = [f for f in files if f[-13:] == target_date_str + '.txt'] 

>>> target_date_str + '.txt' 
'_03232016.txt' 

data = [] 
for f in files_txt: 
     data.append(pd.read_excel(os.path.join(path, f)) 
df = pd.concat(data, ignore_index=True) 
+0

這實際上有助於一噸,謝謝!但我還有一個問題。你會知道如何處理文件日期創建系統時間戳到這個?有時日期顯示在文件名中,有時不顯示。 – JD2015

+0

你能舉出實際文件名的例子嗎? – Alexander

+0

當然; price_list_20150309025753.txt就是一個例子。還有其他一些文件需要引入到腳本中,它們的命名約定相似,只是日期而不是日期時間,所以上面的代碼非常有用。有時,price_list_文件根本沒有日期時間標記或任何日期標記,所以如果沒有可用的系統,也可以使用系統。 – JD2015

1

爲了表示你的日期時間變量與在目錄中文件掩碼搜索文件所需的格式和glob字符串中使用strftime

import datetime as dt 
import glob 

fmask = r'\\Documents\FileList\*' + (dt.datetime.today() - dt.timedelta(7)).strftime('%m%d%Y') + '*.txt' 
files_txt = glob.glob(fmask) 

# concatenate all CSV/txt files into one data frame 
df = pd.concat([pd.read_csv(f) for f in files_txt], ignore_index=True) 

PS我猜你想使用read_csv而不是read_excel時與txt文件一起工作,除非你真的有txt擴展的excel文件?

+0

是我的錯誤。我使用相同的代碼來處理大量的excel文件,所以我忘了複製到read_csv而不是excel。 – JD2015

相關問題