2017-02-22 35 views
0

我正在研究在文件夾中的多個文件上運行腳本的代碼。我能夠在每個文件上運行代碼,但只能保存到一個輸出文件,然後重寫該文件。我怎樣才能得到這個代碼來保存輸出到單獨的文件?最好使用與每個原始文件相似的名稱。這是我迄今爲止所做的。在文件夾中的多個文件上運行python代碼並將它們寫入單獨的文件

import os, re 
import pandas as pd 
directory = os.listdir('C:/Users/user/Desktop/NOV') 
os.chdir('C:/Users/user/Desktop/NOV') 

for file in directory: 
    df = pd.read_csv(file, index_col="DateTime", parse_dates=True) 
    df = df.resample('1min').mean() 
    df = df.reindex(pd.date_range(df.index.min(), df.index.max(), freq="1min")) 
    df.to_csv("newfile.csv", na_rep='NaN') 

回答

1

好吧,它顯然會寫入同一個文件,因爲您總是在to_csv中給出相同的文件名。使用os.path.basename基於舊的一個沒有擴展名來創建一個新的文件名:

df.to_csv(os.path.basename(file) + "-processed.csv", na_rep='NaN') 
1

只需在循環的每次迭代的最後一行中更改文件名即可。 就像for i, file in enumerate(directory):然後df.to_csv("new_" + file + ".csv", na_rep='NaN')會做。

1

我的方法:

  • 使用glob.glob代替os.listdir濾掉不csv文件文件
  • 不要執行os.chdir,這是不好的做法,因爲其他模塊可能不知道您更改了當前目錄,並且相對更改dir兩次將會失敗,使用glob.glob很好,可以避免這種情況。
  • 創建一個文件具有相同的名稱,但在同一目錄"new_"前綴(運行兩次將創建"new_new_文件,雖然)

代碼:

import os, re, glob 
import pandas as pd 

input_dir = 'C:/Users/user/Desktop/NOV' 

for file in glob.glob(os.path.join(input_dir,"*.csv")): 
    df = pd.read_csv(file, index_col="DateTime", parse_dates=True) 
    df = df.resample('1min').mean() 
    df = df.reindex(pd.date_range(df.index.min(), df.index.max(), freq="1min")) 
    new_filename = os.path.join(input_dir,"new_"+os.path_basename(file)) 
    df.to_csv(new_filename, na_rep='NaN') 
+0

謝謝你爲什麼會認爲os.chdir不好的做法? – acb

+0

看到我的編輯。在答案中加入。 –

0

的「文件」你在for循環中引用的應該是您在目錄中操作的文件的字符串。

for file in directory: 
    print file 
    #oldfile.csv 

您可以使用它來創建一個引用原始文件的新文件。像這樣:

for file in directory: 
    df.to_csv("Output -" + file, na_rep='NaN') #make this the last line of your for-loop. 
    #File will be called 'Output - oldfile.csv' 
相關問題