当前位置: 首页 > 知识库问答 >
问题:

迭代目录下文件时的FileNotFoundError

令狐俊风
2023-03-14
import os
import pandas as pd

FILES = os.listdir("/CADEC/original")

for file in FILES:
    if file.startswith("ARTHROTEC."):
        print(file)
ARTHROTEC.1.ann
ARTHROTEC.10.ann
ARTHROTEC.100.ann
ARTHROTEC.101.ann
ARTHROTEC.102.ann
ARTHROTEC.103.ann
ARTHROTEC.104.ann
ARTHROTEC.105.ann
ARTHROTEC.106.ann
ARTHROTEC.107.ann
ARTHROTEC.108.ann
ARTHROTEC.109.ann
ARTHROTEC.11.ann
ARTHROTEC.110.ann
ARTHROTEC.111.ann
ARTHROTEC.112.ann
ARTHROTEC.113.ann
ARTHROTEC.114.ann
ARTHROTEC.115.ann
...

我想从一个目录下从某些字母开始的所有文件中提取数据。如上所示,当我遍历目录并打印每个符合的文件名时,我得到一列文件名(字符串)。同时,data=pd.read_csv(“/cadec/original/arthrotec.1.ann”,sep='\t',header=none)工作得非常好。但是,运行以下代码只会返回错误。为什么找不到文件?我该怎么做才能解决这个问题?

for file in FILES:
    if file.startswith("ARTHROTEC."):
        data = pd.read_csv(file, sep='\t', header=None)
FileNotFoundError: [Errno 2] File ARTHROTEC.1.ann does not exist: 'ARTHROTEC.1.ann'

共有1个答案

周滨海
2023-03-14
  • os.listdir只返回目录中的文件名,不返回路径,并且pandas需要文件的路径(或相对路径),除非该文件与代码在同一目录中。
  • 学习pathlib模块会更好,该模块将路径视为带有方法的对象,而不是字符串。
    • .glob-生成与模式匹配的对象的生成器
    • Python 3的pathlib模块:驯服文件系统
    import pandas as pd
    from pathlib import Path
    
    # create the path object and get the files with .glob
    files = Path('/CADEC/original').glob('ARTHROTEC*.ann')
    
    # create a list of dataframes, 1 dataframe for each file
    df_list = [pd.read_csv(file, sep='\t', header=None) for file in files]
    
    # alternatively, create a dict of dataframes with the filename as the key
    df_dict = {file.stem: pd.read_csv(file, sep='\t', header=None) for file in files}
    
    Python 3.8.5 (default, Sep  3 2020, 21:29:08) [MSC v.1916 64 bit (AMD64)] on win32
    import os
      ...: from pathlib import Path
      ...: os.listdir('e:/PythonProjects/stack_overflow/t-files')
    Out[2]: 
    ['.ipynb_checkpoints',
     '03900169.txt',
     '142233.0.txt',
     '153431.2.txt',
     '17371271.txt',
     '274301.5.txt',
     '42010316.txt',
     '429237.7.txt',
     '570651.4.txt',
     '65500027.txt',
     '688599.3.txt',
     '740103.5.txt',
     '742537.6.txt',
     '87505504.txt',
     '90950222.txt',
     't1.txt',
     't2.txt',
     't3.txt']
    
    list(Path('e:/PythonProjects/stack_overflow/t-files').glob('*'))
    Out[3]: 
    [WindowsPath('e:/PythonProjects/stack_overflow/t-files/.ipynb_checkpoints'),
     WindowsPath('e:/PythonProjects/stack_overflow/t-files/03900169.txt'),
     WindowsPath('e:/PythonProjects/stack_overflow/t-files/142233.0.txt'),
     WindowsPath('e:/PythonProjects/stack_overflow/t-files/153431.2.txt'),
     WindowsPath('e:/PythonProjects/stack_overflow/t-files/17371271.txt'),
     WindowsPath('e:/PythonProjects/stack_overflow/t-files/274301.5.txt'),
     WindowsPath('e:/PythonProjects/stack_overflow/t-files/42010316.txt'),
     WindowsPath('e:/PythonProjects/stack_overflow/t-files/429237.7.txt'),
     WindowsPath('e:/PythonProjects/stack_overflow/t-files/570651.4.txt'),
     WindowsPath('e:/PythonProjects/stack_overflow/t-files/65500027.txt'),
     WindowsPath('e:/PythonProjects/stack_overflow/t-files/688599.3.txt'),
     WindowsPath('e:/PythonProjects/stack_overflow/t-files/740103.5.txt'),
     WindowsPath('e:/PythonProjects/stack_overflow/t-files/742537.6.txt'),
     WindowsPath('e:/PythonProjects/stack_overflow/t-files/87505504.txt'),
     WindowsPath('e:/PythonProjects/stack_overflow/t-files/90950222.txt'),
     WindowsPath('e:/PythonProjects/stack_overflow/t-files/t1.txt'),
     WindowsPath('e:/PythonProjects/stack_overflow/t-files/t2.txt'),
     WindowsPath('e:/PythonProjects/stack_overflow/t-files/t3.txt')]
    

 类似资料:
  • 如何仅在目录中迭代文本文件?到目前为止,我所拥有的是; 这是可行的,但是我必须将.py文件存储在同一个目录(文件夹)中才能使其运行,因此迭代包含了.py文件本身。理想情况下,我想指挥的是:; “查看此子目录/文件夹,并循环访问其中的所有文件” 或。。。 我确信我要求的东西相当直截了当,但我不知道如何继续。可能值得我强调的是,我通过反复试验获得了glob模块,因此,如果这是绕过此特定方法的错误方法,

  • 干杯大家, 我需要python 3.6的帮助。所以我有这样的数据结构: 我目前正在主目录所在的目录下工作,所以我不需要在此之前指定路径。首先,我想遍历主目录,找到所有子目录。然后我想在他们每一个人身上找到。wav文件,当处理完这些文件后,我想转到下一个子目录,以此类推,直到它们都被打开。处理wav文件。这正是我想做的。wav文件被输入到我的程序中,处理它们,这样我就可以把它们转换成numpy数组,

  • 问题 你想在一个固定长度记录或者数据块的集合上迭代,而不是在一个文件中一行一行的迭代。 解决方案 通过下面这个小技巧使用 iter 和 functools.partial() 函数: from functools import partial RECORD_SIZE = 32 with open('somefile.data', 'rb') as f: records = iter(p

  • 修改定时清理 /tmp 目录下的文件 初衷 默认系统是超过 30 天不访问的文件自动清除的,但是有时候硬盘用得紧可以考虑修改周期 设置方法 编辑配置文件:vim /etc/cron.daily/tmpwatch #! /bin/sh flags=-umc /usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \

  • 本文向大家介绍Java删除文件、目录及目录下所有文件的方法实例,包括了Java删除文件、目录及目录下所有文件的方法实例的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要实现的功能是删除某个目录及目录下的所有子目录和文件,涉及到的知识点:File.delete()用于删除“某个文件或者空目录”!所以要删除某个目录及其中的所有文件和子目录,要进行递归删除。 具体代码示例如下: 总结 以上就是这篇