os.path.basename到出口

2024-04-25 16:32:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

**

^{pr2}$

**

  gzsuppl = Chem.ForwardSDMolSupplier(gzip.open(infile))
  for m in gzsuppl:
  if m is None: continue
...etc

file.close()
print(count)

我不清楚如何捕捉变量[0](即上游的所有内容)。xaa.fastq.gz)并用作新输出文件的基名? 不幸的是,它只是将新的输出文件写为“???”而不是6个字母的实际顺序。 谢谢你的帮助。在


Tags: 文件pathinimportforisosinfile
2条回答

我不熟悉您使用的输入数据类型,但以下是我可以告诉您的:

  1. 您缺少的“显而易见的”是outfileinfile没有任何联系。您的outfile行使用??????,而不是实际的文件名,因为这正是您所要求的。是glob.glob将其转换为匹配列表。在

    下面是我如何写输出行的这一方面:

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

    , 1确保它永远不会拆分多次,无论文件名有多疯狂。这只是使用splitrsplit时养成的一个好习惯。

  2. 因为glob模式可以匹配不以.xaa.fastq.gz结尾的*.gz文件,这意味着碰巧出现在文件夹列表中的一个随机的.gz文件将导致outfile与{}具有相同的路径,并最终写入输入文件。在

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

    1. 在您的glob中使用*.xaa.fastq.gz,而不是*.gz。我不推荐这样做,因为一个输入错误很容易潜入并使它们再次不同,这会悄无声息地重新引入bug。

    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重命名为inpathoutfile重命名为outpath,将{}重命名为{}。这样,您就可以仅从变量名来判断每个对象是路径(即字符串)还是Python文件对象,并且在您(重新)定义它并得到一个非常令人困惑的错误消息之前,没有访问{}的风险。

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

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'中添加一个占位符。在

相关问题 更多 >