如何从脚本中使用 linux 命令 "cat"?

How to use linux command "cat" from a script?

输入:A.fasta

>A
sldkfjslkdcskd

输入:B.fasta

>B
pofnvkweu

预期output:A_B.fasta

>A
sldkfjslkdcskd
>B
pofnvkweu

代码:

my_model_dir_path='../my_model'
word='.fasta'

for f in os.listdir(my_model_dir_path):
    if word in f:
        subprocess.call(["cat", f"{f}"])

错误信息:

No such file or directory

我使用子进程调用 linux 命令 cat 以类似预期输出的 fasta 格式连接 fasta 文件。但是,即使文件和目录存在于正确的路径中,我也会收到类似 No such file or directory 的消息。

我看到了这个post:https://www.delftstack.com/howto/python/python-cat/

import os

os.system("echo 'Hello! Python is the best programming language.' >> ~/file.txt")
os.system("cat ~/file.txt")

输出: 你好! Python 是最好的编程语言。

我不确定您为什么要执行一个新命令 (cat) 来执行此操作,而您可以使用 Python 的 built-in 文件操作来执行此操作。

Append a text to file in Python

os.listdir returns 相对于给定目录的路径。 因此,您尝试在 ./A.fasta 而不是 ../my_model/A.fasta.

处抓取文件

试试这个:

for f in os.listdir(my_model_dir_path):
    if word in f:
        subprocess.call(["cat", f"{my_model_dir_path}/{f}"])

如果您使用 python3,pathlib 很有用。

from pathlib import Path

for f in Path(my_model_dir_path).glob("*.fasta"):
    subprocess.call(["cat", f"{f}"])

似乎文件路径缺少工作目录部分。 同样使用 tail 让事情变得不那么困难

#!/usr/bin/env python3
import os
import subprocess

CWD = os.getcwd()
files = [f for f in os.listdir(CWD) if str(f).endswith(".fasta")]
subprocess.run(["tail", "-n", "+1", *files])
在这种情况下,

cat 可能不是最好的工具。 但如果你真的想使用 cat,那么我建议这样做:

for f in files:
    file_path = CWD+"/"+f
    subprocess.run(["echo", f])
    subprocess.run(["cat", file_path])

我可能是错的,但是从 python 调用 bash 并没有多大意义,因为它也可以在 python 内完成。

seq = ""
files = [f for f in os.listdir(CWD) if str(f).endswith(".fasta")]
for f in files:
    seq += ">" + f + "\n"
    fasta = open(f'{CWD}/{f}', "r")
    seq += fasta.read()
    fasta.close()
out = open("A_B.fasta", "w")
out.write(seq)
out.close()