python中的动态文件名

时间:2014-02-13 15:58:28

标签: python ubuntu python-idle

我在编写算法的文件管理部分时遇到了问题。

我的文件管理器的目的是获取一个源文件,然后逐行读取,并根据过滤器将每行拆分为新文件。

数据以制表\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.txt的文件名。要获得更多数字,请将示例中的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 个答案:

答案 0 :(得分: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))
    ...