Я намагаюся надрукувати список файлів у діапазоні дат, встановлених користувачем.
Це мої зразки файлів: Зверніть увагу, що у файлі немає "2015-01-01"
Якщо я ввожу діапазон від 2015-01-02
до 2015-01-05
він надрукує список файлів. Але якщо я вводжу від 2015-01-01
до 2015-01-05
це призведе до помилки:
OSError: (2, "No such file or directory", "\2015-01-01")
Чи можна мати try-Osim-Pass або continue, щоб мій цикл все ще продовжував і друкував 2015-01-02
до 2015-01-05
. І просто відмовити файлу не знайдено.
Це мій поточний код:
FileNameList = []
date = start_date
while date <= end_date:
folder_name = date.strftime(DATE_FORMAT)
data_folder = path.join(pathDir, folder_name)
#print data_folder
for filefolder in os.listdir(data_folder):
filefolder = data_folder + "\" + filefolder
FileNameList.append(filefolder)
date += delta_one_day
for filefolder in FileNameList:
for file in os.listdir(filefolder):
if ".txt" in file:
filename = filefolder + "\" + file
print filename
Відповіді:
0 для відповіді № 1Ви можете оточити os.listdir
дзвоніть зі спробою, за винятком:
try:
for filefolder in os.listdir(data_folder):
filefolder = data_folder + "\" + filefolder
except OSError:
pass
2 для відповіді № 2
Ви можете спробувати / за винятком циклу, але кращим рішенням може бути лише додавання існуючих каталогів до вашого списку спочатку:
# your code and while loop here
if os.path.isdir(data_folder):
for filefolder in os.listdir(data_folder):
filefolder = data_folder + "\" + filefolder
if os.path.isdir(filefolder):
FileNameList.append(filefolder)
Введення for
цикл всередині блоку try / osim може стати трохи брудним, оскільки ви не зможете продовжувати цикл там, де ви зупинилися, у випадку виникнення винятку. Але якщо ви хочете дотримуватися Стратегія EAFP:
for filefolder in FileNameList:
try:
files = os.listdir(filefolder)
except OSError:
# You could log/print a warning here if you need.
continue
for file in files:
if ".txt" in file:
filename = filefolder + "\" + file
print filename
1 для відповіді № 3
Відповідь ви дали самі.
try:
#handles the file
except OSError:
pass # or log it if needed.
0 для відповіді № 4
Ви можете скористатись продовжити заяву :
Оператор continue у Python повертаєконтроль до початку циклу while. Оператор continue відхиляє всі інші оператори поточної ітерації циклу і переміщує елемент керування назад у верхню частину циклу.
Оператор continue може використовуватися як у циклі, так і для циклів.
#!/usr/bin/python
for letter in "Python": # First Example
if letter == "h":
continue
print "Current Letter :", letter
var = 10 # Second Example
while var > 0:
var = var -1
if var == 5:
continue
print "Current variable value :", var
print "Good bye!"
Це дасть такий результат:
Current Letter : P
Current Letter : y
Current Letter : t
Current Letter : o
Current Letter : n
Current variable value : 10
Current variable value : 9
Current variable value : 8
Current variable value : 7
Current variable value : 6
Current variable value : 4
Current variable value : 3
Current variable value : 2
Current variable value : 1
Good bye!
0 для відповіді № 5
Нижче наведено приклад, де ми перевіряємо, що файлкаталог існує до переходу до циклу for. Можна вважати більш "пітонічним" використовувати спробу, крім блоку, однак я вважаю, що в цьому випадку проста перевірка є чистішою (лише моя думка).
for filefolder in FileNameList:
# CHECK THAT THE DIRECTORY EXISTS HERE
if not os.path.isdir(filefolder):
continue # this instruction will immediately jump to the next for loop iteration, effectively skipping the current iteration.
for file in os.listdir(filefolder):
if ".txt" in file:
filename = filefolder + "\" + file
print filename