【问题标题】:Python - Iterating over all text files recursivelyPython - 递归迭代所有文本文件
【发布时间】:2018-02-21 05:20:56
【问题描述】:

我正在使用 python 3.6 创建一个文本解析器。我的文件布局如下:

(我将使用的实际文件结构比这要广泛得多。)

-Directory(main folder)
    -amerigroup.txt
    -bcbs.txt
    childfolder
         -medicare.txt

我需要将文本提取到 2 个不同的列表中(遍历并附加到我不断增长的列表中)。每当我运行我当前的代码时,我似乎无法让我的程序打开我的 medicare.txt 文件来读取和提取信息。我收到一条错误消息,指出没有这样的文件或目录:'medicare.txt'。

我的目标是从 3 个文件中获取数据并一次性提取。如何获取 amerigroup 和 bcbs 数据,然后进入子文件夹并获取 medicare.txt,然后对我的文件路径的所有分支重复此操作?

我只是想在这段代码 sn-p 中打开和关闭我的文本文件。到目前为止,这是我所拥有的:

import re
import os
import pandas as pd

#change active directory
os.chdir(r'\\company\Files\HomeDrive\user\My Documents\claimstest')
#rootdir = r'\\company\Files\HomeDrive\user\My Documents\claimstest'

#set up Regular Expression objects to parse X12
claimidRegex = re.compile(r'(CLM\*)(\d+)')
dxRegex = re.compile(r'(ABK:)(\w\d+)(\*|~)(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?')

claimids = []
dxinfo = []

for dirpath, dirnames, files in os.walk(topdir):
    for name in files:
        cid = []
        dx = []
        if name.lower().endswith(exten):
            data = open(name, 'r')
            data.close()

非常感谢您抽出宝贵时间来帮助我!

编辑:到目前为止,我尝试使用 walk 无济于事。我最近的尝试(我也尝试使用 txtfile_full_path - 没有用):

for dirpath, dirnames, filename in os.walk(base_dir):
    for filename in filename:
        #defining file type
        txtfile=open(filename,"r")
        txtfile_full_path = os.path.join(dirpath, filename)
        print(filename)

edit2 适合任何感兴趣的人。这是我对这个问题的最终解决方案:

import re
import os
import pandas as pd


#change active directory
os.chdir(r'\\company\Files\HomeDrive\user\My Documents\claimstest')
base_dir = (r'\\company\Files\HomeDrive\user\My Documents\claimstest')

#set up Regular Expression objects to parse X12
claimidRegex = re.compile(r'(CLM\*)(\d+)')
dxRegex = re.compile(r'(ABK:)(\w\d+)(\*|~)(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?(ABF:)?(\w\d+)?(\*|~)?')

claimids = []
dxinfo = []

for dirpath, dirnames, filename in os.walk(base_dir):
    for filename in filename:
        txtfile_full_path = os.path.join(dirpath, filename)
        x12 = open(txtfile_full_path, 'r')
        for i in x12:
            match = claimidRegex.findall(i)
            for word in match:
                claimids.append(word[1])
        x12.seek(0)
        for i in x12:
            match = dxRegex.findall(i)
            for word in match:
                dxinfo.append(word)
        x12.close()

datadic = dict(zip(claimids, dxinfo))

【问题讨论】:

  • 你应该使用类似os.path.join(dirpath, name)
  • 所以,想想看,你的工作目录没有看到任何medicare.txt,你必须给它一个完整路径或它可以识别的相对路径。
  • juan,我试了一下,但我总是遇到同样的错误。 FileNotFoundError:[Errno 2] 没有这样的文件或目录:'medicare.txt'for dirpath, dirnames, filename in os.walk(base_dir): for filename in filename: #defining file type txtfile=open(filename,"r") txtfile_full_path = os.path.join(dirpath, filename) print(filename)
  • 不知道你在那里做什么。 看起来没有使用txtfile_full_path作为open的参数,而是继续使用filename,但谁知道呢,因为我没有知道您的评论从哪里开始或结束。请编辑您的原始问题并在此处添加代码,是否可读。
  • 我的错误。我编辑了我的帖子。

标签: python list directory


【解决方案1】:

您需要将完整路径传递给open。只是在某处创建一个字符串变量不会为您做任何事情!所以以下应该避免你的错误:

txt_list = []
for dirpath, dirnames, filename in os.walk(base_dir):
    for filename in filename:
        # create full path
        txtfile_full_path = os.path.join(dirpath, filename)
        with open(txtfile_full_path) as f:
            txt_list.append(f.read())

现在应该很容易根据您的正则表达式集成隔离...

【讨论】:

  • 这太好了,谢谢!无论我的文件路径有多深,这都会起作用,对吧?
  • @AngusGray 应该。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
相关资源
最近更新 更多