Python - l oop через файлы в разных папках - PullRequest
2 голосов
/ 14 февраля 2020

Я хочу извлечь данные из нескольких файлов, вложенных в подпапки.

например, структура папок

A/B/C/D.dat
A/B/E/F.dat
A/B/G/H.dat

Код, который я придумал:

import os
values = 2
doc = []
rootdir = 'C:/A/B'

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        if file.endswith('.dat'):
            with open (file, 'rt') as myfile:
                    current_line = 0
                    for mylines in myfile:
                            if current_line == values:
                                doc.append()
                                break
                            current_line += 1
            continue

print(doc)

Ошибка, которую я изо всех сил пытаюсь решить:

...with open (file, 'rt') as myfile:
IOError: [Errno 2] No such file or directory: 'D.dat'

Ответы [ 5 ]

1 голос
/ 14 февраля 2020

Ошибка из-за отсутствия полного пути к файлу. Поэтому вам необходимо убедиться, что в файле, который вы пытаетесь открыть как myfile, должно быть указано «A / B / C / D.dat».

Вы можете добавить приведенный ниже фрагмент в свой лог c, чтобы достичь этого.

for subdir, dirs, files in os.walk(rootdir): for file in files: filepath=subdir+'/'+file

1 голос
/ 14 февраля 2020

Хотя ваше решение не самое чистое. Ошибка, которую вы получаете от

            with open (file, 'rt') as myfile:

, которую следует заменить на

            with open (subdir + "/" + file, 'rt') as myfile:
0 голосов
/ 14 февраля 2020

звучит так, как будто вы ищете третью строку всех файлов .dat в подкаталогах. Есть использование pathlib.Path, вы можете сделать довольно много всего за несколько простых шагов.

from pathlib import Path
doc = []
line_number_of_each_file = values = 2

for file in Path('C:/A/B').rglob('*.dat'):
    doc.append(file.readtext().splitlines()[line_number_of_each_file])

print(doc)
0 голосов
/ 14 февраля 2020

Проблема здесь в том, что вы пытаетесь вызвать filename.dat. Вместо этого вы должны получить доступ к A / B / C / filename.dat. Присоединитесь к пути + имени файла для этого:

import os
values = 2
doc = []
rootdir = 'A/B/C/'

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        if file.endswith('.txt'):
            print(file)
            file = os.path.join(rootdir,subdir,file)
            with open (file, 'rt') as myfile:
                    current_line = 0
                    for mylines in myfile:
                            if current_line == values:
                                doc.append(mylines)
                                break
                            current_line += 1
            continue

print(doc)
0 голосов
/ 14 февраля 2020

У меня была похожая проблема. Моя файловая структура выглядит примерно так:

project
|__dir1
|  |__file_to_read.txt
|
|__dir2
   |__file_reader.py

Чтобы найти другой файл, мне нужно go из одного каталога в родительский каталог моего .py файла. Первоначально я использовал этот код:

import os

current_path = os.path.dirname(__file__)

file_to_read = os.path.relpath('project/dir1/file_to_read', current_path)

Это сработало для меня, но позже я перешел на другую версию. Причина не в том, что вам придется беспокоиться, за исключением того, что этот следующий модуль лучше для обхода пути, чем os.

from pathlib import Path

parent = Path.cwd().parent
file_to_read = Path(f'{parent}/project/dir1/file_to_read.txt').resolve()

Может быть, это будет предпочтительнее, так как он более очень рекомендуется для меня. Надеюсь, это поможет вашей проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...