编写一些方便的脚本,需要指导

时间:2014-05-30 11:23:16

标签: python

所以我写了一个小脚本来处理我们在实验室中使用的分析仪的输出,将几十个CSV文件连接成一个可以很容易地放入我们的计算软件中的文件(例如文件1-48) )。我已经能够在代码中手动输入文件名,但是现在我希望通过询问输入然后使用这些输入执行它来使其他人更容易访问。

现在的代码看起来像这样(我为它有多糟糕而道歉

    import sys
    print sys.argv

    (nos)=raw_input ( "Enter Name of Files to Process without numbers: ").strip()
    print "You entered ", (nos)
    (end)= input ("Enter Number of Last File: ")
    (output)= raw_input ("Enter name of output file: ").strip()


    fout = open('%s.csv' % output, 'a')
    for line in open("%s_1.data" % nos):
        fout.write(line)
    # now the rest:    
    for num in range(2,end):
        f = open('%s'+str(num)+'.data' % nos, )
        f.next() # skip the header
        for line in f:
        fout.write(line)
        f.close() # not really needed
    fout.close()

所以一切似乎都很花哨,直到我到达我希望它增加变量的位,它会给出错误     TypeError在字符串格式化过程中并非所有参数都被转换

所以我在某处弄错了,因为它理解了文件名从USERINPUT_1变为USERINPUT_2的字符串。如果有人能帮助我或指出我可以学习如何做到这一点,我会非常感激!

2 个答案:

答案 0 :(得分:1)

问题在于'%s'+str(num)+'.data' % nos。由于%的优先级高于+,因此表达式解析为:

'%s' + str(num) + ('.data' % nos`)

错误现在有意义:因为.data包含0格式字符,并且您向%提供了一个参数,所以Python抱怨。这可以通过一对括号来修复:

('%s' + str(num) + '.data') % nos`

但是以惯用方式使用格式运算符会更具可读性,即格式化这两个变量并将它们组合起来:

filename = '%s%d.data' % (nos, num)
f = open(filename)
...

无关的样式注释:您不需要在作业左侧的变量周围使用括号。最好避免使用input()raw_input()等函数,并在命令行提供此类数据。这允许脚本的用户(至少是那些体面的操作系统上的用户)利用他们的shell编辑工具来编辑参数及其历史记录以记住上次的参数。

答案 1 :(得分:0)

我使用str.formatwith因为我认为这是首选方法。

import sys
print sys.argv

nos  = raw_input ( "Enter Name of Files to Process without numbers: ").strip() 
print "You entered ", nos
end= raw_input ("Enter Number of Last File: ") 
output = raw_input ("Enter name of output file: ").strip()

with open ('{}.csv'.format(output), 'a') as fout: #using  "with" means  files will be automatically closed
    with open("{}_1.data".format(nos), 'r') as data:
        for line in data:
                fout.write(line)
#now the rest:
with open('{}.csv'.format(output) , 'a') as fout:
   for num in range(2,int(end)): 
        with open('{}{}.data'.format(nos, num),'r') as f:
            f.next() # skip the header
            for line in f:
                fout.write(line)