我是编程的初学者,甚至更多的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.
第二个代码是我尝试使用函数output
和output.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))
你能帮我找出如何将这些数据写入文件吗?
答案 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()
的两次调用。如果您的问题仍然存在,请在此之后告诉我。