对于处理的每个输入文件(参见下面的代码)我试图使用" 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个字母的实际顺序。 感谢您给予的任何帮助。
答案 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)
我不熟悉您正在使用的输入数据类型,但这是我可以告诉您的内容:
您遗漏的“显而易见的事情”是outfile
与infile
无关。您的outfile
行使用的是??????
而不是实际的文件名,因为这就是您要求的内容。它是glob.glob
,将其变成匹配列表。
以下是我如何编写outfile行的那个方面:
outfile = infile.rsplit('.xaa.fastq.gz', 1)[0]
(, 1
确保它永远不会分裂多次,无论文件名有多疯狂。使用split
或rsplit
时,这是一个很好的习惯。像这样。)
你正在为自己设置一个错误,因为glob模式可以匹配*.gz
不以.xaa.fastq.gz
结尾的文件,这意味着一个随机的.gz文件恰好在文件夹列表中出现会导致outfile
与infile
具有相同的路径,并且您最终会写入输入文件。
此问题有三种解决方案适用于您的用例:
在您的glob中使用*.xaa.fastq.gz
代替*.gz
。我不推荐这个,因为很容易让一个拼写错误潜入并再次使它们变得不同,这会无声地重新引入错误。
将输出写入与输入文件不同的文件夹。
outfile = os.path.join(outpath, os.path.relpath(infile, dbpath))
outparent = os.path.dirname(outfile)
if not os.path.exists(outparent):
os.makedirs(outparent)
添加一个assert outfile != infile
行,这样程序就会在“这应该永远不会发生”的情况下以一个有意义的错误消息而死,而不是默默地做错误的事情。
您发布的内容缩进可能是错误的,但看起来您打开了一堆文件,然后才关闭最后一个文件。我的建议是使用它,所以不可能出错:
with open(outfile, 'w+') as file:
# put things which use `file` here
标准库中已存在名称file
,您选择的变量名称无效。我将infile
重命名为inpath
,将outfile
重命名为outpath
,将file
重命名为outfile
。这样,您可以从变量名称中判断每个路径是一个路径(即字符串)还是Python文件对象,并且在您(重新)定义它并获得一个之前不存在访问file
的风险令人困惑的错误信息。