Прямой вывод 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"}