我应该如何格式化我的文件?

时间:2016-03-15 17:37:07

标签: python io

mm1 = [line.strip() for line in open("m1.dat", 'r')]
ii1 = [int(x) for x in mm1]

s1 = 1
er1 = 0.022
er2 = 2.866
w = [1,2,5,6]

f=open('newdat.txt','w')

for item in ii1:
  for i in w:
    if i == 1:
      f.write( s1,item,1,list1[item-1],er2)
    elif i == 2:
      f.write( s1,item,2,list2[item-1],er1)
    elif i == 5:
      f.write( s1,item,5,list3[item-1],er2)
    else:
      f.write( s1,item,6,list4[item-1],er1)

但我得到了

TypeError: function takes exactly 1 argument (5 given)

我明白我需要格式化我的写作但是如何?

2 个答案:

答案 0 :(得分:2)

您正在将6项传递给write()函数。此外,您无法在文件对象上编写列表,您需要将它们转换为字符串。或者在这种情况下,您可以使用str.join()连接它们,然后将其写入文件。

f.write(','.join(map(str,( s1,item,1,list1[item-1],er2)))

另请注意,您不应该打开这样的文件。因为曾经创建了外部对象won't be collected by garbage collector。您只需使用with语句即可打开将在块结束时自动关闭文件的文件。

with open("m1.dat") as f:
    ii1 = [int(x.strip()) for x in f]

s1 = 1
er1 = 0.022
er2 = 2.866
w = [1,2,5,6]

with open('newdat.txt','w') as f:
    for item in ii1:
        for i in w:
            if i % 2 != 0:
                f.write(','.join(map(str, (s1, item, i, list1[item-1], er2)))
            else:
                f.write(','.join(map(str, (s1, item, i, list1[item-1], er1)))

另外作为另一种替代方法(更多pythonic),为了拒绝加入项目并转换为字符串,您可以使用csv模块并将预期的序列写入csv文件。

import csv

# ...
# ...
with open('newdat.csv', 'w') as csvfile:
    spampwriter = csv.writer(csvfile, delimiter=',')
    for item in ii1:
        for i in w:
            if i % 2 != 0:
                spampwriter.writerrow((s1, item, i, list1[item-1], er2))      
            else:
                spampwriter.writerrow((s1, item, i, list1[item-1], er1))

答案 1 :(得分:0)

看起来您正在尝试编写CSV文件。为此,您可以使用CSV模块,也可以在值之间加上逗号:

f.write(",".join(map(str([s1, item, 1, list1[item-1], er2]))))

这将使您尝试写入数组的所有值,然后在每个项目之间放入“,”。它还将该数组的每个项转换为字符串,因为join期望每个元素都是一个字符串。