Python - Как остановить цикл - PullRequest
0 голосов
/ 11 мая 2018

У меня есть это, где он читает файл с именем source1.html, source2.html, source3.html, но когда он не может найти следующий файл (потому что он не существует), он выдает мне ошибку. может быть x количество sourceX.html, поэтому мне нужно что-то сказать, если следующий файл sourcex.html не может быть найден, остановите цикл.

Traceback (последний вызов был последним): файл "main.py", строка 14, в file = open (filename, "r") IOError: [Errno 2] Нет такого файла или каталог: 'source4.html

как мне остановить скрипт, ищущий следующий исходный файл?

from bs4 import BeautifulSoup
import re
import os.path

n = 1
filename = "source" + str(n) + ".html"
savefile = open('OUTPUT.csv', 'w')

while os.path.isfile(filename):

    strjpgs = "Extracted Layers: \n \n"
    filename = "source" + str(n) + ".html"
    n = n + 1
    file = open(filename, "r")
    soup = BeautifulSoup(file, "html.parser")
    thedata = soup.find("div", class_="cplayer")
    strdata = str(thedata)
    DoRegEx = re.compile('/([^/]+)\.jpg')
    jpgs = DoRegEx.findall(strdata)
    strjpgs = strjpgs + "\n".join(jpgs) + "\n \n"
    savefile.write(filename + '\n')
    savefile.write(strjpgs)

    print(filename)
    print(strjpgs)

savefile.close()
print "done"

Ответы [ 4 ]

0 голосов
/ 11 мая 2018

Я предлагаю вам использовать os.path.exists () (which returns True/False) и os.path.isfile () оба.

Используйте с оператором для открытия файла. Это Pythonic способ для открытия файлов.

с оператором предпочтительнее среди профессиональных кодировщиков.

Это содержимое моего текущего рабочего каталога.

H:\RishikeshAgrawani\Projects\Stk\ReadHtmlFiles>dir
 Volume in drive H is New Volume
 Volume Serial Number is C867-828E

 Directory of H:\RishikeshAgrawani\Projects\Stk\ReadHtmlFiles

11/05/2018  16:12    <DIR>          .
11/05/2018  16:12    <DIR>          ..
11/05/2018  15:54               106 source1.html
11/05/2018  15:54               106 source2.html
11/05/2018  15:54               106 source3.html
11/05/2018  16:12                 0 stopReadingIfNot.md
11/05/2018  16:11               521 stopReadingIfNot.py
               5 File(s)            839 bytes
               2 Dir(s)  196,260,925,440 bytes free

В приведенном ниже коде Python показано, как вы будете читать файлы source1.html, source2.html, source.3.html и останавливаться, если больше нет файлов вида sourceX.html (где X - 1, 2, 3, 4, ... и т. Д.).

Пример кода:

import os

n = 1;
html_file_name = 'source%d.html'

# It is necessary to check if sourceX.html is file or directory.
# If it is directory the check it if it exists or not.
# It it exists then perform operation (read/write etc.) on file.
while os.path.isfile(html_file_name % (n)) and os.path.exists(html_file_name % (n)):
    print "Reading ", html_file_name % (n)

    # The best way (Pythonic way) to open file
    # You don't need to bother about closing the file
    # It will be taken care by with statement
    with open(html_file_name % (n), "r") as file:
        # Make sure it works
        print html_file_name % (n), " exists\n"; 

    n += 1;

Выход:

H:\RishikeshAgrawani\Projects\Stk\ReadHtmlFiles>python stopReadingIfNot.py
Reading  source1.html
source1.html  exists

Reading  source2.html
source2.html  exists

Reading  source3.html
source3.html  exists

Итак, исходя из вышеуказанной логики. Вы можете изменить свой код. Это будет работать.

Спасибо.

0 голосов
/ 11 мая 2018

вы можете try открыть файл и break выйти из цикла, когда вы поймаете исключение IOError.

from bs4 import BeautifulSoup
import re
import os.path

n = 1
filename = "source" + str(n) + ".html"
savefile = open('OUTPUT.csv', 'w')

while os.path.isfile(filename):

    try:
      strjpgs = "Extracted Layers: \n \n"
      filename = "source" + str(n) + ".html"
      n = n + 1
      file = open(filename, "r")
    except IOError:
      print("file not found! breaking out of loop.")
      break

    soup = BeautifulSoup(file, "html.parser")
    thedata = soup.find("div", class_="cplayer")
    strdata = str(thedata)
    DoRegEx = re.compile('/([^/]+)\.jpg')
    jpgs = DoRegEx.findall(strdata)
    strjpgs = strjpgs + "\n".join(jpgs) + "\n \n"
    savefile.write(filename + '\n')
    savefile.write(strjpgs)

    print(filename)
    print(strjpgs)

savefile.close()
print "done"
0 голосов
/ 11 мая 2018

Это похоже на ошибку последовательности. Давайте рассмотрим небольшой фрагмент вашего кода, в частности строки, имеющие отношение к filename:

filename = "source" + str(n) + ".html"

while os.path.isfile(filename):

    filename = "source" + str(n) + ".html"
    n = n + 1
    file = open(filename, "r")

Вы генерируете следующее имя файла до того, как откроете файл (или действительно, проверяете старое имя файла и затем открываете новое). Это немного сложно увидеть, потому что вы действительно обновляете n, в то время как filename содержит предыдущее число, но если мы посмотрим на них в последовательности, то выскочит:

n = 1
filename = "source1.html"   # before loop
while os.path.isfile(filename):
 filename = "source1.html"   # first time inside loop
 n = 2
 open(filename)
while os.path.isfile(filename):  # second time in loop - still source1
 filename = "source2.html"
 n = 3
 open(filename)    # We haven't checked if this file exists!

Мы можем исправить это несколькими способами. Один из них - переместить все обновление, n до filename, в конец цикла. Другой способ - позволить механизму цикла обновлять n, что намного проще (реальное исправление заключается в том, что мы используем только одно значение filename в каждой итерации цикла):

for n in itertools.count(1):
    filename = "source{}.html".format(n)
    if not os.path.isfile(filename):
        break
    file = open(filename, "r")
    #...

С риском выглядеть неясным, мы также можем функционально выразить шаги (я использую six здесь, чтобы избежать различий между Python 2 и 3; карта Python 2 не закончится):

from six.moves import map
from itertools import count, takewhile

numbers = count(1)
filenames = map('source{}.html'.format, numbers)
existingfiles = takewhile(os.path.isfile, filenames)

for filename in existingfiles:
    file = open(filename, "r")
    #...

Другие опции включают в себя итерацию только по числам и использование break, когда isfile возвращает False, или просто перехват исключения, когда open не удается (полностью исключая необходимость в isfile).

0 голосов
/ 11 мая 2018

используйте try / except и break

while os.path.isfile(filename):
    try:  # try to do this
         # <your code>
    except FileNotFoundError:  # if this error occurs
         break  # exit the loop

Причина, по которой ваш код в настоящее время не работает, заключается в том, что вы проверяете предыдущий файл, существующий в вашем цикле while.Не следующий.Следовательно, вы также можете сделать

 while True:
     strjpgs = "Extracted Layers: \n \n"
     filename = "source" + str(n) + ".html"
     if not os.path.isfile(filename):
          break
     # <rest of your code>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...