Python: функция открытия не может прочитать файл - PullRequest
0 голосов
/ 20 ноября 2018

Я использую Python 3.6.Я пытаюсь прочитать много (.txt) файлов в нескольких каталогах.Некоторые файлы имеют запятую в имени файла, например 'Proposal for Anne, Barry and Carol.txt'.

Следующий код:

for filepath in glob.iglob(params.input_dir + r'\**\**.*', recursive=True):
    # [not shown here: code that filters on .txt filetype]

    with open(filepath) as f:
        for line in f:
            for word in re.findall(r'\w+', line):
                # do stuff

Выдает ошибку при чтении этого файла:

Traceback (most recent call last):
  File "dir_scraper.py", line 50, in <module>
    results_new = scraper.scrape_file(filepath)
  File "C:\Projects\scraper.py", line 33, in scrape_file
    return func(filepath)
  File "C:\Projects\scraper.py", line 15, in txt
   with open(filepath) as f:
FileNotFoundError: [Errno 2] No such file or directory: 'Z:\\groups\\Proposal for Anne, Barry and Carol.txt'

Я не хочу редактировать имена файлов.

Как правильно читать файлы с запятыми в именах файлов?

Редактировать:

  • Я уверен, что путь существует.

  • Другие файлы из того же каталога анализируются без проблем.

  • Попытка открытьФайл непосредственно из командной строки также дает: Система не может найти указанный путь.

  • Кроме того, я не могу переименовать файл, если я пытаюсь изменить имя через Windows FileИсследователь, чтобы удалить запятую (или изменить что-то еще), он сбрасывается на исходное имя файла.

  • Может ли это быть как-то связано с разрешениями файла?

  • Или, может быть, имя файла слишком длинное?Полный путь от Z:[..] до [..].txt составляет 270 символов.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Во-первых, вы работаете только с файлами, а не с каталогами, а во-вторых, вы можете использовать os.path.join для конвертации в Windows:

>>>os.path.join("d:\ss")
'd:\\ss'

Попробуйте это:

    from pathlib import Path
    import os
    import re
    pathName='./'# r'd:/xx' on windows
    fnLst=list(filter(lambda x:not x.is_dir(),Path(pathName).glob('**/*.txt')))
    print(fnLst)
    for fn in fnLst:
        with open(fn) as f:
            print()
            print(fn)
            for line in f:
                for word in re.findall(r'\w+', line):
                    print(word,end="|")

Выход:

[PosixPath('2.txt'), PosixPath('1.txt')]


2.txt
This|tutorial|introduces|the|reader|informally|to|the|basic|concepts|and|features|of|the|Python|language|and|system|It|helps|to|have|a|Python|interpreter|handy|for|hands|on|experience|but|all|examples|are|self|contained|so|the|tutorial|can|be|read|off|line|as|well|
1.txt
Python|is|an|easy|to|learn|powerful|programming|language|It|has|efficient|high|level|data|structures|and|a|simple|but|effective|approach|to|object|oriented|programming|Python|s|elegant|syntax|and|dynamic|typing|together|with|its|interpreted|nature|make|it|an|ideal|language|for|scripting|and|rapid|application|development|in|many|areas|on|most|platforms|
0 голосов
/ 20 ноября 2018

Это прекрасно работает на Python 3, Windows 10

import glob, re
for filepath in glob.iglob('C:/Users/test-ABC/Desktop/test/' + r'\**\**.*', recursive=True):
    with open(filepath) as f:
        print(f)
        for line in f:
            print(line)
            for word in re.findall(r'\w+', line):
                pass

<_io.TextIOWrapper
name='C:/Users/test-ABC/Desktop/test\\loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong
name\\another
looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong
name\\test, file, name.txt' mode='r' encoding='cp1251'>

line1 
line2
line3

Может быть проблема в длинном пути.Попробуйте проверить такие вопросы: Длинные пути в Python в Windows

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