Ошибка Python os.ошибка обхода IOError

#python #file-io #filepath

#python #file-io #путь к файлу

Вопрос:

Я попытался отследить файл с помощью сервера в имени файла, и я могу распечатать весь файл в каталоге с помощью server **, но когда я пытаюсь прочитать файл, он выдает ошибку» говоря:

 Traceback (most recent call last):
  File "view_log_packetloss.sh", line 27, in <module>
    with open(filename,'rb') as files:
IOError: [Errno 2] No such file or directory: 'pcoip_server_2014_05_19_00000560.txt'
  

Я видел, как задавался подобный вопрос, но я не мог исправить свой, некоторые ошибки были исправлены с помощью chdir для изменения текущего каталога на каталог файлов. Любая помощь приветствуется. Спасибо

 #!usr/bin/env/ python
import sys, re, os

#fucntion to find the packetloss data in pcoip server files
def function_pcoip_packetloss(filename):
        lineContains = re.compile('.*Loss=.*')  #look for "Loss=" in the file
        for line in filename:
                if lineContains.match(line):    #check if line matches "Loss="
                        print 'The file has: '  #prints if "Loss=" is found
                        print line
                        return 0;

for root, dirs, files in os.walk("/users/home10/tshrestha/brb-view/logs/vdm-sdct-agent/pcoip-logs"):
        lineContainsServerFile = re.compile('.*server.*')
        for filename in files:
                if lineContainsServerFile.match(filename):
                        with open(filename,'rb') as files:
                                print 'filename'
                                function_pcoip_packetloss(filename);
  

Ответ №1:

файлы представляют собой имена файловых объектов в корневом каталоге.

dirpath — это строка, путь к каталогу. dirnames — это список имен подкаталогов в dirpath (исключая ‘.’ и ‘..’). filenames — это список имен файлов, не относящихся к каталогам, в dirpath. Обратите внимание, что имена в списках не содержат компонентов пути. Чтобы получить полный путь (который начинается с top) к файлу или каталогу в dirpath, выполните os.path.join(dirpath, name) .

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

 for root, dirs, files in os.walk("/users/home10/tshrestha/brb-view/logs/vdm-sdct-agent/pcoip-logs"):
    lineContainsServerFile = re.compile('.*server.*')
    for filename in files:
            if lineContainsServerFile.match(filename):
                    filename = os.path.join(root, filename)
                    with open(filename,'rb') as files:
                            print 'filename:', filename
                            function_pcoip_packetloss(filename);
  

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

1. спасибо за вашу помощь, похоже, это не работает таким образом, просто print ‘filename’ на самом деле не печатает имя файла.

2. но он открывает правильное имя файла с помощью open(filename,’rb’) в виде файлов:

3. Хорошо, уберите кавычки 'filename' , и тогда вы получите значение этой переменной. Я отредактирую ответ. Но важный момент верен: вы не включали путь к каталогу в имена файлов, которые пытались открыть.

4. спасибо, ребята @holdenweb Я могу получить имя файла, у меня оно тоже было раньше, но при вызове функции оно, похоже, не работает. Ничего не происходит, я пытался проанализировать файл и напечатать определенные строки… Я пытаюсь выяснить, почему, любая помощь приветствуется, спасибо

Ответ №2:

os.walk() Функция представляет собой генератор кортежей из 3 элементов. Каждый кортеж содержит каталог в качестве первого элемента. Второй элемент представляет собой список подкаталогов в этом каталоге, а третий — список файлов.

Чтобы сгенерировать полный путь к каждому файлу, необходимо объединить первую запись (путь к каталогу) и имена файлов из третьей записи (файлов). Самый простой и независимый от платформы способ сделать это использует os.path.join() .

Также обратите внимание, что это будет намного эффективнее использовать

 lineContainsServerFile = re.compile('server')
  

и lineContainsServerFile.search() вместо того, чтобы пытаться сопоставить подстановочную строку. Даже в первом случае ".* завершение является избыточным, поскольку то, что следует за "server" строкой, не имеет значения.