python 2.7生成包含datalist的txt文件

时间:2013-07-20 14:01:52

标签: python file printing output

我是编程的初学者,甚至更多的Python(我可以用c ++制作一些基本的东西......)

我正在研究朋友前一段时间为我制作的代码,并且我想将其输出存储在一个文件中,我认为.txt文件非常适合我想要的内容做。

您将在下面找到2个代码,

第一个可以工作,但只在pythonwin的交互式窗口中打印数据(我使用的是Windows 7和python 2.7)。

它打印出类似的东西,这对我的项目来说是有用的数据:

thrown out: bTUD, K2, MAG B, K1C, K1B, K1A, XTC64 II, REF , LBK, MAG C
1   1   : ['PINKwA', 'GB', 'PINK', 'TUwA'] [ 0.23994351  0.61419796  0.00956974  0.1362888 ] tet_i 66
1   2   : ['PINKwA', 'GB', 'PINK', 'TUwA'] [ 0.23816363  0.61917833  0.01219634  0.13046169] tet_i 66
1   3   : ['PINKwA', 'GB', 'PINK', 'TUwA'] [ 0.23638376  0.6241587   0.01482295  0.12463459] tet_i 66
1   4   : ['PINKwA', 'GB', 'PINK', 'TUwA'] [ 0.23460388  0.62913907  0.01744955  0.11880749] tet_i 66
1   5   : ['PINKwA', 'GB', 'PINK', 'TUwA'] [ 0.23282401  0.63411944  0.02007616  0.11298039] tet_i 66
...etc.

第二个代码是我尝试使用函数outputoutput.write,但它根本不起作用!我在python中缺少基本的语言技能,我想这就是为什么我无法找到解决方案。

第一个代码(打印功能OK)

import tetgen, geometry
from pprint import pprint
import random, csv
import numpy as np
from pprint import pprint

all_colors = [(name, float(X), float(Y), float(Z))
              for name, X, Y, Z in csv.reader(open('colors.csv'))]

# background is marked SUPPORT
support_i = [i for i, color in enumerate(all_colors) if color[0] == 'SUPPORT']
if len(support_i)>0:
    support = np.array(all_colors[support_i[0]][1:])
    del all_colors[support_i[0]]
else:
    support = None

tg, hull_i = geometry.tetgen_of_hull([(X,Y,Z) for name, X, Y, Z in all_colors])
colors = [all_colors[i] for i in hull_i]

print ("thrown out: "
       + ", ".join(set(zip(*all_colors)[0]).difference(zip(*colors)[0])))

targets = [(name, float(X), float(Y), float(Z), float(BG))
           for name, X, Y, Z, BG in csv.reader(open('targets.csv'))]

for target in targets:
    name, X, Y, Z, BG = target

    target_point = support + (np.array([X,Y,Z]) - support)/(1-BG)

    tet_i, bcoords = geometry.containing_tet(tg, target_point)

    if tet_i == None:
        print "out"
        # not in gamut
    else:
        names = [colors[i][0] for i in tg.tets[tet_i]]
        print "%s:" % target[0], names, bcoords, "tet_i", tet_i

编辑:下面的代码有效,但只导出文件中的一行数据

for target in targets:
    name, X, Y, Z, BG = target

    target_point = support + (np.array([X,Y,Z]) - support)/(1-BG)

    tet_i, bcoords = geometry.containing_tet(tg, target_point)


if tet_i == None:
    output = open('output.txt','a')
    output.write(str(target[0]))    

else:
    output = open('output.txt','a')
    names = [colors[i][0] for i in tg.tets[tet_i]]
    output.write(str(target[0]))
    output.write(str(names))
    output.write(str(bcoords))

你能帮我找出如何将这些数据写入文件吗?

2 个答案:

答案 0 :(得分:1)

当您打开文件时,我建议使用'a'作为您案例中的第二个参数,以便始终附加文件,而不是每次调用write方法时都覆盖该文件。 你在begingin中说过想要一个.txt文件,为什么不用一个呢?

output = open('output.txt','a')

其次,文件中的write方法只能接受一个输入。每次要添加内容时都要调用write方法。在你的情况下这样做:


    output.write(target[0])
    output.write(names)
    output.write(bcoords)
    output.write(tet_i)

编辑:此外,您放入文件的任何内容都必须是字符串。您可以使用str()函数将其转换为字符串。

答案 1 :(得分:1)

要添加到user2571168的解决方案,我相信output.write()需要一个字符串,因此请尝试使用str()进行转换。例如,

output.write(str(names))

编辑:

这可能会或可能不会解决您的问题,但您应该在完成写入后关闭该文件。例如:

if tet_i == None:
    output = open('output.txt','a')
    output.write(str(target[0]))
    output.close()

else:
    output = open('output.txt','a')
    names = [colors[i][0] for i in tg.tets[tet_i]]
    output.write(str(target[0]))
    output.write(str(names))
    output.write(str(bcoords))
    output.close()

请注意添加对output.close()的两次调用。如果您的问题仍然存在,请在此之后告诉我。