从文本文件递归打开Python中的文件

0 投票
2 回答
583 浏览
提问于 2025-04-18 09:30

我正在写的一个Python脚本的前几行代码是这样的:

#!/usr/bin/env python

import os
import sys
import subprocess
import csv
import itertools

fin=open("filelist.txt",'r')
print(fin)
for line in fin:
        TARG_FILE = open('fin', 'r')
        spamreader = csv.reader(TARG_FILE, delimiter='\t')
        for line in spamreader:
                print(line[0:6])

其中,filelist.txt是和这个脚本在同一个文件夹里的一个文本文件。如果我把fin放在引号里,函数返回的是:

  File "VCFParser.py", line 13, in <module>
    TARG_FILE = open('fin', 'r')
IOError: [Errno 2] No such file or directory: 'fin'

但是如果我不加引号,得到的结果是:

Traceback (most recent call last):
  File "VCFParser.py", line 11, in <module>
    TARG_FILE = open(fin, 'r')
TypeError: coercing to Unicode: need string or buffer, file found

我怀疑这个问题和这里提到的情况很相似:

不过,我用那里的信息还是没法让脚本正常工作。

如果我打印(fin),它会返回一个合适的文件路径,用于读取:

print(fin)
16.31235000.31366000/vcfBeta-GS000012109-ASM.vcf.gz.summary.txt

我这里缺少了什么呢?

这是否和filelist.txt文件中每行末尾的换行符有关?

2 个回答

0

这两个错误的原因非常明显。

错误:没有这样的文件或目录:'fin'

你试图打开一个名为 'fin' 的文件,但这个文件不存在。

错误:... 需要字符串或缓冲区,找到了文件

在使用 open 时,你必须提供文件名。你传入的是文件描述符,这就导致了错误。

解决方案:打开一个真实存在的文件名

如果你的 "filelist.txt" 文件中每一行都有文件名,你可能想要打开的是这一行的内容:

#!/usr/bin/env python

import os
import sys
import subprocess
import csv
import itertools

with open("filelist.txt",'r') as fin:
    for line in fin:
        fname = line.strip("\n")
        with open(fname, "r") as TARG_FILE:
            spamreader = csv.reader(TARG_FILE, delimiter='\t')
            for line in spamreader:
                    print(line[0:6])

这里的 `line.strip("\n")` 是为了去掉换行符,因为大多数行都有这个符号(最后一行可能没有)。

教训:仔细阅读错误信息

错误信息通常能很好地解释原因。

  1. 从最底部开始看
  2. 逐步往上查,直到找到你写的代码中导致错误的那一行
  3. 尽量理解错误信息到底在说什么。
  4. 如果需要,可以试着想象一下,如何逻辑上将最底部的错误和你写的代码联系起来。

如果我们习惯了它们有点奇怪的表达方式,我们可能会更快找到问题。

2

你的问题是,你把一个文件对象传给了 open 函数,而不是传入你刚打开的文件中的字符串。

for line in fin:
    TARG_FILE = open('fin', 'r')

需要替换成

for line in fin:
    TARG_FILE = open(line, 'r')

你的 line 变量指的是 filelist.txt 中的每一行,而不是 fin

撰写回答