Прямой вывод python в файл linux
У меня есть script написанный на python, который я запускаю на ubuntu. Я хотел бы, чтобы выход этой команды был направлен в файл.
print str(kFx) + ',' + str(kFy) + ',' + str(kFz)
Я бы идеально использовал файл python.py > file.txt, но script имеет некоторые интерактивные части, которые я не смогу использовать, если перенаправить вывод в файл.
Я попытался изменить код на это, но я получаю синтаксические ошибки. Я буквально использую python в первый раз, так что извините за недостаток знаний.
print (str(kFx) + ',' + str(kFy) + ',' + str(kFz) , file=open("output.txt", "a"))
Любые идеи о том, как это сделать?
Спасибо,
Alex
Ответы
Ответ 1
вы можете открыть файл с помощью file=open("output.txt", "a"))
, как и вы. то вместо печати вы будете использовать
file.write(str(kFx) + ',' + str(kFy) + ',' + str(kFz))
потому что вы открыли файл в режиме добавления (обозначенный "a" в открытом виде), он добавит эту строку в конец файла. вам также может потребоваться добавить новую строку после строки:
file.write("\n")
когда вы закончите писать:
file.close()
Ответ 2
Если вы используете c-keyword; файловый поток будет оставаться открытым внутри блока. Тогда вам не нужно запоминать закрытие, когда вы закончите.
with open('test.output', 'w') as f:
f.write('{0},{1},{2}\n'.format(kFx, kFy, kFz))
Если вы хотите добавить в файл как echo "test" → test.txt, а не echo "test" > test.txt
Затем просто измените открытый режим на "a" вместо "w"
Ответ 3
На Python 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
вверху вашего script и преобразовать в строку вручную ", ".join(map(str, kF))
или просто:
print(kFx, kFy, kFz, sep=', ', file=file)
Вы можете использовать kF
объект вместо kFx
, kFy
, kFz
, например, кортеж/список:
kF = "kFx value", "kFy value", "kFz value"
или для удобства чтения вы можете использовать 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.x
, kF.y
, kF.z
. Если вам нужен изменяемый объект, вы можете использовать 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
.
Для более богатой функциональности вы можете попробовать attrs
пакет:
#!/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')
Для запуска этого и других примеров кода, требующих сторонних пакетов Python из PyPI, вы можете использовать fades
для удобства (для install, run: sudo apt-get install fades
). Хотя это необязательно, вы можете просто установить зависимости вручную: pip install attrs
(обязательно запустите script с тем же python
исполняемым файлом как pip
: 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"}