os.path.basename到outfile

时间:2017-11-25 00:00:59

标签: python os.path

对于处理的每个输入文件(参见下面的代码)我试图使用" os.path.basename"写入新的输出文件 - 我知道我遗漏了一些明显的东西......?

button#test

**

import os
import glob
import gzip

dbpath = '/home/university/Desktop/test'

for infile in glob.glob( os.path.join(dbpath, 'G[D|E]/????/*.gz') ):
print("current file is: " + infile)

**

   outfile=os.path.basename('/home/university/Desktop/test/G[D|E]                              
/????/??????.xaa.fastq.gz').rsplit('.xaa.fastq.gz')[0]

  file=open(outfile, 'w+')

我不清楚如何捕获变量[0](即.xaa.fastq.gz上游的所有内容)并将其用作新输出文件的基本名称? 不幸的是,它只是将新的输出文件写为" ??????"而不是6个字母的实际顺序。 感谢您给予的任何帮助。

2 个答案:

答案 0 :(得分:1)

这似乎会在示例代码中从.xaa.fastq.gz返回的路径中的glob()上游获取所有内容:

import os

filepath = '/home/university/Desktop/test/GD /AAML/DEAAML.xaa.fastq.gz'
filepath = os.path.normpath(filepath)  # Changes path separators for Windows.

# This section was adapted from answer https://stackoverflow.com/a/3167684/355230
folders = []
while 1:
    filepath, folder = os.path.split(filepath)
    if folder:
        folders.append(folder)
    else:
        if filepath:
            folders.append(filepath)
        break
folders.reverse()

if len(folders) > 1:
    # The last element of folders should contain the original filename.
    filename_prefix = os.path.basename(folders[-1]).split('.')[0]
    outfile = os.path.join(*(folders[:-1] + [filename_prefix + '.rest_of_filename']))
    print(outfile)  # -> \home\university\Desktop\test\GD \AAML\DEAAML.rest_of_filename

当然outfile中的最终结果不是最终路径加文件名,因为我不知道文件名的其余部分是什么,只是放置一个占位符('.rest_of_filename' )。

答案 1 :(得分:1)

我不熟悉您正在使用的输入数据类型,但这是我可以告诉您的内容:

  1. 您遗漏的“显而易见的事情”是outfileinfile无关。您的outfile行使用的是??????而不是实际的文件名,因为这就是您要求的内容。它是glob.glob,将其变成匹配列表。

    以下是我如何编写outfile行的那个方面:

    outfile = infile.rsplit('.xaa.fastq.gz', 1)[0]
    

    , 1确保它永远不会分裂多次,无论文件名有多疯狂。使用splitrsplit时,这是一个很好的习惯。像这样。)

  2. 你正在为自己设置一个错误,因为glob模式可以匹配*.gz不以.xaa.fastq.gz结尾的文件,这意味着一个随机的.gz文件恰好在文件夹列表中出现会导致outfileinfile具有相同的路径,并且您最终会写入输入文件。

    此问题有三种解决方案适用于您的用例:

    1. 在您的glob中使用*.xaa.fastq.gz代替*.gz。我推荐这个,因为很容易让一个拼写错误潜入并再次使它们变得不同,这会无声地重新引入错误。

    2. 将输出写入与输入文件不同的文件夹。

      outfile = os.path.join(outpath, os.path.relpath(infile, dbpath))
      
      outparent = os.path.dirname(outfile)
      if not os.path.exists(outparent):
          os.makedirs(outparent)
      
    3. 添加一个assert outfile != infile行,这样程序就会在“这应该永远不会发生”的情况下以一个有意义的错误消息而死,而不是默默地做错误的事情。

  3. 您发布的内容缩进可能是错误的,但看起来您打开了一堆文件,然后才关闭最后一个文件。我的建议是使用它,所以不可能出错:

    with open(outfile, 'w+') as file:
        # put things which use `file` here
    
  4. 标准库中已存在名称file,您选择的变量名称无效。我将infile重命名为inpath,将outfile重命名为outpath,将file重命名为outfile。这样,您可以从变量名称中判断每个路径是一个路径(即字符串)还是Python文件对象,并且在您(重新)定义它并获得一个之前不存在访问file的风险令人困惑的错误信息。