直接python输出到linux文件

Direct python output to linux file

本问题已经有最佳答案,请猛点这里访问。

我有一个用python编写的脚本,我在Ubuntu上运行它。我希望将此命令的输出定向到文件中。

print str(kFx) + ',' + str(kFy) + ',' + str(kFz)

我最好使用python.py>file.txt,但是脚本有一些交互部分,如果我将输出重定向到一个文件,我将无法使用这些部分。

我试图把代码改成这个,但语法错误。我第一次真正使用python,所以请原谅我缺乏知识。

1
print (str(kFx) + ',' + str(kFy) + ',' + str(kFz) , file=open("output.txt","a"))

有什么办法吗?

谢谢您,亚历克斯


你可以像打开文件那样用file=open("output.txt","a"))打开文件。那你就不用打印了

1
file.write(str(kFx) + ',' + str(kFy) + ',' + str(kFz))

因为您在附加模式下打开了文件(在open中用"a"表示),它会将这个字符串添加到文件的末尾。您可能还需要在字符串后添加新行:

1
2
file.write("
"
)

写完后:

1
file.close()


在python 3上,它看起来像:

1
2
3
with open("output.txt","a") as file:  # append to the file
    print(*kF, sep=', ', file=file)
    # etc...

为了可读性,我在逗号后加了空格。看到**(双星)和*(星)对参数做了什么?

在python 2上,可以在脚本顶部添加from __future__ import print_function,然后手动转换为字符串",".join(map(str, kF)),或者只是:

1
print(kFx, kFy, kFz, sep=', ', file=file)

您可以使用kF对象而不是kFxkFykFz,例如元组/列表:

1
kF ="kFx value","kFy value","kFz value"

或者为了可读性,可以使用collections.namedtuple创建自定义类:

1
2
3
4
5
6
from collections import namedtuple

Point3D = namedtuple("Point3D","x y z")

kF = Point3D("kFx value","kFy value","kFz value")
# -> Point3D(x='kFx value', y='kFy value', z='kFz value')

它支持kF.xkF.ykF.z语法。如果需要可变对象,可以使用types.SimpleNamespace

1
2
3
4
5
from types import SimpleNamespace

kF = SimpleNamespace(x="kFx value", y="kFy value", z="kFz value")
kF.x +=" modified"
# -> namespace(x='kFx value modified', y='kFy value', z='kFz value')

在python 2上,您可以使用class Point3D: pass部分地模拟它。

为了获得更丰富的功能,您可以尝试attrs软件包:

1
2
3
4
5
6
7
8
#!/usr/bin/fades
import attr  # fades.pypi attrs

Point3D = attr.make_class("Point3D", ["x","y","z"])

kF = Point3D("kFx value","kFy value","kFz value")
kF.x +=" modified"
# -> Point3D(x='kFx value modified', y='kFy value', z='kFz value')

要运行这个和其他需要pypi中第三方python包的代码示例,可以使用fades以方便安装(要安装,请运行:sudo apt-get install fades)。虽然没有必要,但您可以手动安装依赖项:pip install attrs(确保使用与piphead -1 $(command -v pip)相同的python可执行文件运行脚本)。

kF打印到文件:

10

要将其保存为JSON格式:

1
2
3
4
5
import json

with open("kF.json","w", encoding='utf-8') as json_file:  # overwrite the file
    json.dump(attr.asdict(kF), json_file)
    # -> {"x":"kFx value modified","y":"kFy value","z":"kFz value"}


如果使用WITH关键字,文件流将只在块内保持打开状态。然后你就不必记得当你结束的时候关闭它了。

1
2
3
with open('test.output', 'w') as f:
    f.write('{0},{1},{2}
'
.format(kFx, kFy, kFz))

如果要附加到文件,如echo"test">>test.txt而不是echo"test">test.txt然后将打开模式改为"A"而不是"W"