Как исправить ошибку FileNotFoundError при доступе к файлам в корпусе

#python #corpus #file-not-found

#python #corpus #файл не найден

Вопрос:

Я пытаюсь написать код, который обращается к файлам из корпуса под названием Mini-CORE. У меня не было проблем с печатью listdir и извлечением из них кодов жанра. Однако, когда я пытаюсь получить доступ к самим файлам, чтобы извлечь текст, он выдает мне FileNotFoundError: [Errno 2] No such file or directory: '1 IN EN IN-IN-IN-IN EN-EN-EN-EN WIKI 9990014.txt' первое имя файла в папке. Итак, я не понимаю, почему он сообщает мне имя файла, если утверждает, что оно не существует? Я только что где-то допустил синтаксическую ошибку?

 import os
import re
import spacy
from spacy import displacy
from collections import Counter

nlp = spacy.load('en')

entries = os.listdir('Mini-CORE')
entry_list = []

# this returns the genre codes for each file
def genre_code(filename):
    for entry in entries:
        regex1 = r'((?<=1 )w*)'  # This captures the genre code
        genre = re.findall(regex1, entry)
        entry_list.append(genre)
genre_code(entries)
print(entry_list)


# FileNotFoundError???
# This captures the text after after the <h> or <p> tags
def relevant_text(filename):
        for filename in entries:
            with open(filename) as current_file:
                text = current_file.read()
                regex2 = r'((?<=<h>|<p>).*)'
                text2 = re.findall(regex2, text)
                print(text2)

print(relevant_text(entries))

  

Комментарии:

1. listdir результаты не включают путь к файлу. Вы хотели бы добавить os.path.join('Mini-CORE', filename) к каждому из введенных имен entries . relevant_text() кажется ошибочным. Вы передаете a filename , но сразу же перезаписываете его именами файлов из entries . Это затрудняет написание ответа без распространения этой предполагаемой ошибки.

Ответ №1:

os.listdir возвращает имя файла без его пути. Вам нужен родительский каталог файла при открытии файла. pathlib это объектно-ориентированная библиотека путей, которая упрощает передачу путей, не беспокоясь об именах каталогов и путей.

Используйте Path.glob для перечисления каталога, и возвращаемые пути будут содержать как имя файла, так и его путь, доступные для использования вашей программой. При некоторой очистке ваш код может быть

 from pathlib import Path
import re
import spacy
from spacy import displacy
from collections import Counter

nlp = spacy.load('en')

entries = Path('Mini-CORE').glob("*")

# this returns the genre codes for each file
def genre_code(entries):
    entry_list = []
    for entry in entries:
        regex1 = r'((?<=1 )w*)'  # This captures the genre code
        genre = re.findall(regex1, entry.name)
        entry_list.append(genre)
    return entry_list
    
entry_list = genre_code(entries)
print(entry_list)

# This captures the text after after the <h> or <p> tags
def relevant_text(entries):
        for filename in entries:
            with open(filename) as current_file:
                text = current_file.read()
                regex2 = r'((?<=<h>|<p>).*)'
                text2 = re.findall(regex2, text)
                print(text2)

print(relevant_text(entries))