重命名多个目录中的文件

时间:2015-11-12 14:33:37

标签: python rename

我在多个目录中有相同的文件。我想更改它们的名称,因此它们将对应于它们所在目录的唯一ID。

' *'表示唯一标识符,例如' 067'例如

文件名总是' NoAdapter_len25.truncated_sorted.fastq'

我希望每个目录中的文件名为' * NoAdapter_len25.truncated_sorted.fastq',其中*代表唯一标识符

以下是我得到的错误:

Traceback (most recent call last):
  File "change_names.py", line 19, in <module>
    rename(name, new_name)
TypeError: Can't convert '_io.TextIOWrapper' object to str implicitly

以下是产生它的代码:

from glob import glob
import re
from os import rename

#path = "/home/users/screening/results_Sample_*_hg38_hg19/N*"

files = glob(path)


for f in files:
    with open(f) as name:
        sample_id = f.partition('results_')[-1].rpartition('hg38_hg19')[0]
        #print(sample_id)
        back = f[-38:]
        new_name = sample_id + back
        rename(name, new_name)

2 个答案:

答案 0 :(得分:0)

你有一些问题:

  1. 您正在打开文件没有明显的原因(它确认该文件存在并且在open时可读,但即使使用打开句柄,也可以在该文件和{{之间移动或删除该名称1}},所以你没有阻止任何竞争条件)
  2. 您将打开的文件对象传递给rename,但os.rename传递os.rename,而不是文件类对象
  3. 您正在对路径进行大量“魔术”操作,而不是使用适当的str函数
  4. 尝试此操作以简化代码。当我正在做你的例子所做的事情时,我包含了一些内联注释,但它没有多大意义(或者它的形式很差):

    os.path

答案 1 :(得分:-1)

您要重命名文件(name)和文件名,它需要两个文件名。要从文件获取文件名,您可以执行此操作

old_filename = os.path.abspath(name.name)