2017-03-07 114 views
1

我有一个用python写的脚本,我在ubuntu上运行。我想将这个命令的输出导入到文件中。直接python输出到linux文件

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

我会非常使用python.py> file.txt的,但剧本有一些互动的部分,我不能,如果我将输出重定向到一个文件中使用。

我试着改变代码,但我得到语法错误。我从字面上首次使用python,所以原谅我缺乏知识。

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

有关如何做到这一点的任何想法?

谢谢 亚历

+1

您可能正在使用Python 2.无论是打印更改为['打印>>开放( “output.txt”,“a”),str(kFx)+','+ str(kFy)+','+ str(kFz)'](https://docs.python.org/2/reference/ simple_stmts.html#the-print-statement),或者在你的代码文件的顶部放一个['from __future__ import print_function'](https://www.python.org/dev/peps/pep-3105/)想要使用'print()'函数(而不是t)他声明)。 – dhke

回答

1

,你可以打开该文件file=open("output.txt", "a"))像你这样。然后,而不是打印你会使用

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

becasue你打开追加模式的文件(记为“一”开放式),将这个字符串添加到文件的末尾。您可能还需要您的字符串后添加一个新行:

file.write("\n") 

,当你写完:

file.close() 
+0

即使发生异常,也要关闭文件,可以使用'with'语句。另外,你可以调用print()函数来格式化输入,而不用调用'str()'并手动地对字符串进行分析。 – jfs

+0

按照您的指示完美工作。谢谢:) –

0

如果您有关键字使用;文件流只会在块内保持打开状态。然后,当你完成后,你不必记得关闭它。

如果你的意思是附加到文件中像回声“测试” >> test.txt的,而不是呼应“测试”> test.txt的 然后,只需改变开放模式“一”,而不是“W”

+1

''\ n''不见了。你不需要手动调用'str()','format()'可以为你做。您可以省略数字格式:''{},{},{} \ n'.format(kFx,kFy,kFz)'。 – jfs

+1

良好的眼睛感谢纠正我,因为我不知道在Python中有什么'a'选项。谢谢 :) –

0

在Python 3中,它可能看起来像:

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

我逗号的可读性后增加的空间。见What does ** (double star) and * (star) do for parameters?

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

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

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

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

或可读性,你可以use collections.namedtuple创建一个自定义类:

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语法。如果你需要一个可变的对象,你可以use types.SimpleNamespace

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

对于更丰富的功能,你可以try attrs package

#!/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包的其他代码示例,您可以use fades for convenience(安装,运行:sudo apt-get install fades)。虽然没有必要,但您可以手动安装依赖项:pip install attrs(请确保使用与pip相同的python可执行文件运行脚本:head -1 $(command -v pip))。

要打印kF到文件:

print(*attr.astuple(kF), sep=', ', file=file) 
# -> kFx value modified, kFy value, kFz value 

要保存它以JSON格式:

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"}