从文本文件递归打开Python中的文件
我正在写的一个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")` 是为了去掉换行符,因为大多数行都有这个符号(最后一行可能没有)。
教训:仔细阅读错误信息
错误信息通常能很好地解释原因。
- 从最底部开始看
- 逐步往上查,直到找到你写的代码中导致错误的那一行
- 尽量理解错误信息到底在说什么。
- 如果需要,可以试着想象一下,如何逻辑上将最底部的错误和你写的代码联系起来。
如果我们习惯了它们有点奇怪的表达方式,我们可能会更快找到问题。
2
你的问题是,你把一个文件对象传给了 open
函数,而不是传入你刚打开的文件中的字符串。
for line in fin:
TARG_FILE = open('fin', 'r')
需要替换成
for line in fin:
TARG_FILE = open(line, 'r')
你的 line
变量指的是 filelist.txt
中的每一行,而不是 fin
。