【问题标题】:Reading text file from different directories with python os.walk使用 python os.walk 从不同目录读取文本文件
【发布时间】:2021-06-13 07:46:36
【问题描述】:

我有 5 个目录,每个目录中有 25 个文本文件。当我尝试读取文本文件时,我收到一条错误消息,例如 '[Errno 2] No such file or directory: 'AEITMYIRQLP.txt'

我的代码:

import re
import os
for roots,dirs,files in os.walk(spath):
    for file in files:
        with open(file,'r') as f:
            readf=f.readlines()
            for line in readf:
                lstNumbers=[]
                pattern =re.compile(r'\d{3}-\d{3}-\d{4}')
                matches=re.findall(pattern,line)
                for match in matches:
                    lstNumbers.extend(match)

【问题讨论】:

  • 我认为代码正在当前目录中寻找 AEITMYIRQLP.txt。但请注意,从os.walk 返回的第三项文件只是文件名。您需要将其与他们所在的目录连接起来,该目录分配给 root,这是从os.walk 返回的第一项。 Here 就是一个例子。

标签: python python-3.x operating-system


【解决方案1】:

正如@nofinator 在评论中敏锐地提到的那样,os.walk() 需要谨慎使用以确保生成完整路径。

涉及lstNumbers 的代码还有其他几个问题,以及您对它所做的事情。

这是一种修复代码的方法,使用较新的 pathlibroot 中的内容加入文件名,并解决 lstNumbers 问题:

import pathlib

lstNumbers = [] # declare it here so you don't overwrite it for each file
pattern = re.compile(r'\d{3}-\d{3}-\d{4}') # declare here to avoid re-declaring

for roots,dirs,files in os.walk(spath):
    for fl in files: # changed to `fl` so we don't shadow built-in `file`
        with open(pathlib.Path(roots).joinpath(fl),'r') as f:
            for line in f:
                lstNumbers = []
                matches = re.findall(pattern,line)
                for match in matches:
                    lstNumbers.append(match) # `.append()` instead of `.extend()`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多