2014-02-13 3 views
-1

У меня возникла проблема с кодированием части управления файлами моего алгоритма.динамическое имя файла в python

Целью моего файлового менеджера является получение исходного файла, затем его чтение по строке и разбиение каждой строки в новом файле в соответствии с фильтрами.

Данные разделены таблицей \t.

Фильтр состоит из сбора всех линий с одинаковыми 4-го параметра (вы можете сказать, что он их заказывает).

Моя проблема заключается в том, что я хочу иметь динамические имена файлов в соответствии с этими параметрами, которые являются целыми числами. Таким образом, основной файл будет заполнен частью алгоритма, как это:

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)) 

Я смотрел какое-то решение и нашел это: Для версий Python до 2.6, используйте оператор строки форматирования%:

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() 

Edit: Я думаю, что я очень плохо объяснил свою проблему, вот что я закодирован для первого файла журнала, перед любой обработкой:

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 - это список. И, наконец, при условии, что Logfile является file, вам, вероятно, необходимо будет сделать 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

Смежные вопросы