【问题标题】:Printing in a loop循环打印
【发布时间】:2011-09-19 17:38:41
【问题描述】:

我正在尝试操作以下文件。

 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) 应该包含 6 列时只包含 3 列。我如何告诉程序为每一步 j=0,1,.... 转移要打印的列。

对于 j = 0,程序应输出到前 3 列,对于 j = 1,程序应输出到后 3 列 (3,4,5),依此类推。

最后,len 函数给出了输入文件中的行数,但是,什么函数给出了文件中的列数?

谢谢。

【问题讨论】:

  • print 1, 2, 3 然后print 1, 2, 3 再次打印成两行...

标签: python printing for-loop


【解决方案1】:

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])
        ...

【讨论】:

    【解决方案2】:

    你不需要:

    • 使用 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
    

    【讨论】:

    • 非常感谢您帮助我编写此代码。这给了我正在寻找的确切输出。我是结构工程专业的博士生,但我不是程序员。
    • @Cloud Strife:谢谢你的客气话。请考虑接受答案——点击左侧的大“勾”。
    【解决方案3】:

    以防万一您的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)
    

    【讨论】:

    • 你确定这符合 OP 的要求吗?您的代码似乎在同一行中的 2 个点之间打印 delta。他的代码在相邻行的点之间打印增量。
    • @JohnMachin 哎呀,我的错!刚刚修好了。
    • xrange(len(the_whole_file)) ... 以防他的文件变大?
    • 很好……pos.shape(0) 够好吗?或者干脆停止阅读整个文件,而只是流过它?我想我太麻木了;-)
    • 别傻了 :-) 阅读我的回答。
    猜你喜欢
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 2017-06-07
    • 2015-04-03
    • 2020-09-11
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多