Печать в цикле - PullRequest
       4

Печать в цикле

0 голосов
/ 19 сентября 2011

У меня есть следующий файл, которым я пытаюсь манипулировать.

 1  2 -3 5  10  8.2
 5  8  5 4  0   6
 4  3  2 3 -2   15
 -3 4  0 2  4   2.33
 2  1  1 1  2.5 0
 0  2  6 0  8   5

Файл просто содержит числа.

Я пытаюсь написать программу для вычитания строк из каждогодругой и распечатать результаты в файл.Моя программа ниже и dtest.txt - это имя входного файла.Название программы: make_distance.py.

from math import *

posnfile = open("dtest.txt","r")
posn = posnfile.readlines()
posnfile.close()

for i in range (len(posn)-1):
    for j in range (0,1):
        if (j == 0):
            Xp = float(posn[i].split()[0])
            Yp = float(posn[i].split()[1])
            Zp = float(posn[i].split()[2])

            Xc = float(posn[i+1].split()[0])
            Yc = float(posn[i+1].split()[1])
            Zc = float(posn[i+1].split()[2])
        else:
            Xp = float(posn[i].split()[3*j+1])
            Yp = float(posn[i].split()[3*j+2])
            Zp = float(posn[i].split()[3*j+3])

            Xc = float(posn[i+1].split()[3*j+1])
            Yc = float(posn[i+1].split()[3*j+2])
            Zc = float(posn[i+1].split()[3*j+3])

        Px = fabs(Xc-Xp)
        Py = fabs(Yc-Yp)
        Pz = fabs(Zc-Zp)
        print Px,Py,Pz

Программа правильно вычисляет значения, но, когда я пытаюсь вызвать программу для записи выходного файла,

mpipython make_distance.py > distance.dat

Выходной файл (distance.dat) содержит только 3 столбца, если он должен содержать 6. Как мне указать программе переключать столбцы для печати для каждого шага j = 0,1, ....

При j = 0 программа должна выводить в первые 3 столбца, при j = 1 программа должна выводить во вторые 3 столбца (3,4,5) и т. Д. И т. Д.

Наконец,Функция len дает количество строк во входном файле, но какая функция дает количество столбцов в файле?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 19 сентября 2011

Добавьте , в конец вашего оператора print, и он не будет печатать символ новой строки, а затем, когда вы выйдете из цикла for, добавьте дополнительный print, чтобы перейти к следующей строке:

for j in range (0,1):
    ...

    print Px,Py,Pz,
print

Предполагая, что все строки имеют одинаковое количество столбцов, вы можете получить количество столбцов, используя len(row.split()).

Кроме того, вы определенно можете немного сократить свой код, я не уверен, какова цель j, но следующее должно быть эквивалентно тому, что вы делаете сейчас:

    for j in range (0,1):
        Xp, Yp, Zp = map(float, posn[i].split()[3*j:3*j+3])
        Xc, Yc, Zc = map(float, posn[i+1].split()[3*j:3*j+3])
        ...
1 голос
/ 20 сентября 2011

Вам не нужно:

  • использовать numpy
  • читать весь файл сразу
  • знать, сколько столбцов
  • использовать неловкую запятую в конце оператора печати
  • использовать подписку списка
  • использовать math.fabs ()
  • явно закрыть файл

Попробуйте это(не проверено):

with open("dtest.txt", "r") as posnfile:
    previous = None
    for line in posnfile:
        current = [float(x) for x in line.split()]
        if previous:
            delta = [abs(c - p) for c, p in zip(current, previous)]
            print ' '.join(str(d) for d in delta)
        previous = current
0 голосов
/ 20 сентября 2011

на тот случай, если ваш dtest.txt станет больше, и вы не хотите перенаправлять вывод, а скорее напишите в distance.dat, особенно если вы хотите использовать numpy. Спасибо @John за указание на мою ошибку в старом коде; -)

import numpy as np
pos = np.genfromtxt("dtest.txt")
dis = np.array([np.abs(pos[j+1] - pos[j]) for j in xrange(len(pos)-1)])
np.savetxt("distance.dat",dis)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...