2014-02-13 40 views
-1

我在編碼我的算法的文件管理部分時遇到了問題。python中的動態文件名

我的文件管理器的目標是獲取一個源文件,然後逐行讀取它,並根據過濾器將每行分割到一個新文件中。

數據以製表符分隔\t

過濾器包含收集所有具有相同4rth參數的行(可以說它是對它們進行排序)。

我的問題是,我想根據參數,這是一個整數動態文件名。 所以主文件將充滿這樣的算法的一部分:

Logfile.write("%s\t %s\t %s\t %s\t %s\t %s\n" % (count, BSid, UEid, nbr_RB, Metric,)) 

nbr_RB將是我的濾波器參數,它是一組隨機整數1〜100

我想要做的是自動驗證碼:

open('/usr/local/resultat/file_1', 'w') # here 1 is linked to the nbr_RB[i] 
open('/usr/local/resultat/file_2', 'w') 
. 
. 
. 
open('/usr/local/resultat/file_nbr_RB[i]', 'w') 

所以每次都會有文件名的nbr_RB[i],我不寫100行。

當我將應用過濾器:

ligne = Logfile.split(「\n」) 
par = ligne.split(「\t」) 

if par [3] = nbr_RB[1]: 
    file_nbrRB[1].write (「%s \n」 % (ligne)) 

elif par [3] = nbr_RB[4]: 
    file_nbrRB[4].write (「%s \n」 % (ligne)) 
. 
. 
. 
elif par [3] = nbr_RB[i]: 
    file_nbrRB[i].write (「%s \n」 % (ligne)) 

我已經看過了一些解決方案,並發現這一點:之前2.6 對於Python版本,使用字符串格式化操作符%:

filename = "ME%d.txt" % i 

對於2.6及更高版本,請使用str.format()方法:

filename = "ME{0}.txt".format(i) 

雖然第一個例子仍然在2.6中工作,第二個例子是首選。 如果你有10頁以上的文件來命名這種方式,你可能要添加前導零,這樣的文件目錄列表中正確排序:

filename = "ME%02d.txt" % i 
filename = "ME{0:02d}.txt".format(i) 

這將產生像ME00.txt到ME99的文件名。文本。要獲得更多數字,請將示例中的2替換爲更高的數字(例如,ME {0:03d} .txt)。 人和:

import os, sys 

path = "c:/temp" 
for filename in ["chas.txt", "dave.txt"]: 
f = open (os.path.join (path, filename)) 
print filename 
print f.read() 
print 
f.close() 

編輯:我想我真的不好解釋了我的問題,這裏是我編寫的第一個日誌文件,任何治療前:

logfile= open('/usr/local/Python-3.3.0/my_tests/fichier_log/logfile_%s_%s.txt' %c %z , 'a') 

,這裏是錯誤:

Traceback (most recent call last): 
    File "/usr/local/Python-3.3.0/my_tests/log_files.py", line 181, in <module> 
    main() 
    File "/usr/local/Python-3.3.0/my_tests/log_files.py", line 167, in main 
    logfile= open('/usr/local/Python-3.3.0/my_tests/fichier_log/logfile_%s_%s.txt' %c %z , 'a') 
TypeError: not enough arguments for format string 
+1

有什麼問題嗎? – XORcist

+0

我想知道我怎樣才能使文件動態的命名,所以它會根據nbr_RB改變[I]這是一個整數,像我解釋。 它會發生錯誤,如果我把代碼像我寫在這裏。 – metalticket

+0

我誠實地說不出你有什麼問題。你似乎暗示你不知道如何在運行時計算一個文件名,然後在後面你展示如何使用'.format()'或'%'。爲什麼這些方法不適合你? –

回答

0

看看這一行:

logfile= open('/long/path/fichier_log/logfile_%s_%s.txt' %c %z , 'a') 

問題是你不能先替換一個,然後再換另一個格式參數。你需要通過所有參數格式字符串的一次,作爲一個元組:

logfile= open('/long/path/fichier_log/logfile_%s_%s.txt' % (c, z), 'a') 

在這也看一看:

ligne = Logfile.split(「\n」) 
par = ligne.split(「\t」) 
file_nbrRB[1].write (「%s \n」 % (ligne)) 

你傳入所有行作爲格式字符串的列表,這可能不是你想要做的。另外,ligne.split將不起作用,因爲ligne是一個列表。 最後,假設Logfilefile,您可能需要執行Logfile.read().split('\n')Logfile.read().splitlines()Logfile.readlines()。試試這個:

for ligne in Logfile.readlines(): 
    par = ligne.split(「\t」) 
    if par [3] = nbr_RB[1]: 
     file_nbrRB[1].write (「%s \n」 % (ligne)) 
    ... 
+0

解決方案的第一部分幫助了我,謝謝。 我是第二部分的鋼鐵股。 – metalticket