生成QIIME2 manifest文件的Python脚本出现SyntaxError错误
问题:QIIME2单端测序Manifest文件生成脚本语法错误
需求说明
我编写了Python脚本用于生成QIIME2的manifest文件(包含fastq数据绝对路径,方便导入QIIME2),输入为存储样本名的文本文件(格式示例:SRR123456 SRR123457 SRR123458...)和fastq文件目录,运行命令为python ./manifest_single.py --input-dir seqs。
我的脚本
#!/local/cluster/bin/python3 # assign a variable to the file of interest file_name = "seq.by.sys_accession.txt" dir = "/filepath/seqs" # open the file with a file handle read_SRR = open(file_name, "r") # obtain a list of lines in your file allLines_list = read_SRR.readlines() # create output file outFile = "manifest.txt" read_outFile = open(outFile, "w") read_outFile.write(f"sample-id\tabsolute-filepath\n") # loop over the body of data lines until the end of the file for rawLine in allLines_list: line = rawLine.strip() print(f"|{line}|") with open(outFile, "a") as f: read_outFile.write(f"{line}\t{dir}/{line}.R1.fastq.gz\n") outFile.close() read_SRR.close()
报错信息
运行脚本时持续触发语法错误:
[name@congo metagenome-analysis]$ python ./manifest_single.py --input-dir seqs File "./manifest_single.py", line 17 read_outFile.write(f"sample-id\tabsolute-filepath\n") ^ SyntaxError: invalid syntax
我尝试将\t和\n替换为字面制表符,也反复检查输入文件结构和内容,但问题仍未解决。
解决方案
核心原因:f-string版本兼容性问题
脚本使用了Python 3.6及以上版本才支持的f-string语法,但你实际运行脚本的Python版本可能低于3.6,或者脚本开头shebang指定的Python版本与运行时python命令指向的版本不一致。
具体修复步骤
验证Python版本匹配
运行以下命令确认版本:python --version /local/cluster/bin/python3 --version如果
python指向Python 2或低于3.6的Python 3,改用python3执行脚本:python3 ./manifest_single.py --input-dir seqs替换f-string为兼容写法(若无法升级Python)
将所有f-string替换为str.format()语法:- 原代码:
read_outFile.write(f"sample-id\tabsolute-filepath\n")
改为:read_outFile.write("sample-id\tabsolute-filepath\n") - 原代码:
print(f"|{line}|")
改为:print("|{}|".format(line)) - 原代码:
read_outFile.write(f"{line}\t{dir}/{line}.R1.fastq.gz\n")
改为:read_outFile.write("{}\t{}/{}.R1.fastq.gz\n".format(line, dir, line))
- 原代码:
修复脚本其他潜在问题
- 循环内重复打开输出文件会导致句柄冲突,直接移除
with open(outFile, "a") as f:行,仅用初始打开的read_outFile写入即可。 - 脚本未处理
--input-dir命令行参数,需添加argparse模块解析参数,替换硬编码的目录路径。
- 循环内重复打开输出文件会导致句柄冲突,直接移除
修复后的完整脚本
#!/local/cluster/bin/python3 import argparse # 解析命令行参数 parser = argparse.ArgumentParser(description='Generate QIIME2 manifest file for single-end reads') parser.add_argument('--input-dir', required=True, help='Directory containing fastq files') args = parser.parse_args() # 样本名文件路径 file_name = "seq.by.sys_accession.txt" dir = args.input_dir # 读取样本名 read_SRR = open(file_name, "r") allLines_list = read_SRR.readlines() # 创建输出文件 outFile = "manifest.txt" read_outFile = open(outFile, "w") read_outFile.write("sample-id\tabsolute-filepath\n") # 循环写入每条记录 for rawLine in allLines_list: line = rawLine.strip() if not line: # 跳过空行 continue print("|{}|".format(line)) read_outFile.write("{}\t{}/{}.R1.fastq.gz\n".format(line, dir, line)) # 关闭文件句柄 read_outFile.close() read_SRR.close()
内容的提问来源于stack exchange,提问作者Geomicro
相关产品推荐
相关产品推荐

