所以我写了一个小脚本来处理我们在实验室中使用的分析仪的输出,将几十个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的字符串。如果有人能帮助我或指出我可以学习如何做到这一点,我会非常感激!
答案 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.format
和with
因为我认为这是首选方法。
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)