使用 python 打开和编辑文件夹中的多个文件

Opening and editing multiple files in a folder with python

我正在尝试修改我的 .fasta 文件:

>YP_009208724.1 hypothetical protein ADP65_00072 [Achromobacter phage phiAxp-3]
MSNVLLKQ...

>YP_009220341.1 terminase large subunit [Achromobacter phage phiAxp-1]
MRTPSKSE...

>YP_009226430.1 DNA packaging protein [Achromobacter phage phiAxp-2]
MMNSDAVI...

对此:

>Achromobacter phage phiAxp-3
MSNVLLKQ...

>Achromobacter phage phiAxp-1
MRTPSKSE...

>Achromobacter phage phiAxp-2
MMNSDAVI...

现在,我已经有了可以对单个文件执行此操作的脚本:

with open('Achromobacter.fasta', 'r') as fasta_file:
    out_file = open('./fastas3/Achromobacter.fasta', 'w')
    for line in fasta_file:
        line = line.rstrip()
        if '[' in line:
            line = line.split('[')[-1]
            out_file.write('>' + line[:-1] + "\n")
        else:
            out_file.write(str(line) + "\n")

但我无法为文件夹中的所有 120 个文件自动执行该过程。

我尝试使用 glob.glob,但似乎无法正常工作:

import glob

for fasta_file in glob.glob('*.fasta'):
    outfile = open('./fastas3/'+fasta_file, 'w')
    with open(fasta_file, 'r'):
        for line in fasta_file:
            line = line.rstrip()
            if '[' in line:
                line2 = line.split('[')[-1]
                outfile.write('>' + line2[:-1] + "\n")
            else:
                outfile.write(str(line) + "\n")

它给了我这个输出:

A
c
i
n
e
t
o
b
a
c
t
e
r
.
f
a
s
t
a

我设法获得了文件夹中所有文件的列表,但无法使用列表中的对象打开某些文件。

import os


file_list = []
for file in os.listdir("./fastas2/"):
    if file.endswith(".fasta"):
        file_list.append(file)

您正在迭代文件名,这会为您提供名称中的所有字符,而不是文件的行。这是代码的更正版本:

import glob

for fasta_file_name in glob.glob('*.fasta'):
    with open(fasta_file_name, 'r') as fasta_file, \
            open('./fastas3/' + fasta_file_name, 'w') as outfile:
        for line in fasta_file:
            line = line.rstrip()
            if '[' in line:
                line2 = line.split('[')[-1]
                outfile.write('>' + line2[:-1] + "\n")
            else:
                outfile.write(str(line) + "\n")

作为 Python 脚本的替代方案,您可以简单地从命令行使用 sed

sed -i 's/^>.*\[\(.*\)\].*$/>/' *.fasta

这将修改所有文件,因此请考虑先复制它们。

考虑到您现在可以更改文件名的内容,您需要自动化该过程。我们通过删除用于打开文件两次的文件处理程序来更改一个文件的功能。

def file_changer(filename):
    data_to_put = ''
    with open(filename, 'r+') as fasta_file:
        for line in fasta_file.readlines():
            line = line.rstrip()
            if '[' in line:
                line = line.split('[')[-1]
                data_to_put += '>' + str(line[:-1]) + "\n"
            else:
                data_to_put += str(line) + "\n"
        fasta_file.write(data_to_put) 
        fasta_file.close()

现在我们需要遍历所有文件。所以让我们为它使用 glob 模块

import glob
for file in glob.glob('*.fasta'):
    file_changer(file)