我有一个带有ID的txt文件,每个ID有34个数值。这些表示单个标签和17个坐标(x,y),表示每个ID的数字照片上的几何地标。
输入是这种格式的txt文件:
ID1 x1 y1
ID1 x2 y2
ID1 x3 y3
ID1 x4 y4
.....
ID1 x17 y17
ID2 x1 y1
ID2 x2 y2
.....
ID2 x17 y17
等等....
我需要输出文件如下:
ID1 x1 y1 x2 y2 x3 y3 x4 y4 ........ x17 y17
ID2 x1 y1 x2 y2 x3 y3 ........... x17 y17
我只是将输入文件的列放入列表中,因此我有一个ID列表(str),xs(str)列表和ys(str)列表。
for i in range(0, len(x), 17):
coord = '\t'.join([x[i+j] + '\t' + y[i+j] for j in range(16)])
OutputFile.write(ID[i] + "\t" + coord)
但是,我的输出txt文件如下所示:
ID1 x1 y1
x2 y2
x3 y3
x4 y4
ID2 x1 y1
x2 y2
x3 y3
x4 y4
那么,我怎样才能在同一条线上写下所有坐标?我使用的是Python 3.4.0,我的所有数据都是str类型。
谢谢
答案 0 :(得分:0)
这可能是你想要的:
with open('output.txt', 'w') as fo:
with open('input.txt', 'r') as fi:
for i, line in enumerate(fi.readlines()):
print(line.strip(), end=' ', file=fo)
if not (i+1) % 17:
print(file=fo)
它只输出没有行结尾的行,但是然后添加一行到每个第17行结束。你会在每一行的末尾得到一个尾随空格。如果你真的不想这样,你可以列出输入行,然后重新加入它们:
with open('output.txt', 'w') as fo:
with open('input.txt', 'r') as fi:
lines = []
for i, line in enumerate(fi.readlines()):
lines.append(line.strip())
if not (i+1) % 17:
print(' '.join(lines))
lines = []
答案 1 :(得分:0)
我无法在Python 3.3上重现您的结果。请注意,如果x,y中的值是整数,则字符串添加将不起作用,因此请确保它们不是\n
- 终止字符串。例如,以下内容最接近您的代码,似乎可以执行您想要的操作:
n, nf = 2, 4
x = [str(i) for i in range(n * nf)]
y = [str(i*2) for i in range(n * nf)]
ID = [str(10*i) for i in range(nf)]
OutputFile = open('output2.txt', 'w')
nx = len(x)
for i in range(0, len(x), nf):
OutputFile.write(ID[i//nf] + "\t" + x[i] + "\t" + y[i] + "\t" + x[i+1] + "\t" + y[i+1] + "\t" + x[i+2] + "\t" + y[i+2] + "\t" + x[i+3] + "\t" + y[i+3] + "\n")
OutputFile.close()
和更多Pythonic:
n, nf = 2, 4
x = [str(i) for i in range(n * nf)]
y = [str(i*2) for i in range(n * nf)]
ID = [str(1001*i) for i in range(nf)]
OutputFile = open('output3.txt', 'w')
for i in range(0, len(x), nf):
line = '\t'.join([x[i+j] + '\t' + y[i+j] for j in range(nf)])
OutputFile.write(ID[i//nf] + '\t' + line + '\n')
OutputFile.close()
也有效。您可能需要共享一些数据才能在此方面取得更多进展。