【问题标题】:Opening files recursively in python from a textfile从文本文件在python中递归打开文件
【发布时间】:2014-08-02 04:44:09
【问题描述】:

我正在编写的 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

我怀疑这个问题与here发现的问题非常相似:

但是,我无法使用那里的信息使脚本工作。

如果我 print(fin),它将返回适当的文件路径以供读取:

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

我在这里缺少什么?

这与 filelist.txt 文件中每一行末尾的换行符有什么关系吗?

【问题讨论】:

    标签: python recursion file-io


    【解决方案1】:

    这两个错误的原因都很清楚。

    错误:没有这样的文件或目录:'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") 来去除换行符,该换行符出现在大多数行中(最后一行中可能缺少)。 p>

    经验教训:仔细阅读错误信息

    错误消息通常很好地解释了原因。

    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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-22
        • 2011-12-20
        • 1970-01-01
        • 1970-01-01
        • 2014-03-27
        • 2019-09-09
        相关资源
        最近更新 更多