2017-02-14 9 views
1

Я хочу сохранить некоторые файлы в подкаталоге текущего каталога, но по какой-либо причине, хотя Python «успешно» сохраняет выходные файлы, каталог не работает Нигде не появляется.Python os.path.join() - не будет правильно комбинировать

com_path = './' 
out_f = "output" 
crop_f = "1-cropped" 
(…) 
curr_path = os.path.join(com_path, out_f, crop_f) 
for elem in images: 
    img = img_trim(elem['img']) 
    filename = curr_path + 'p_%(p_num)s, (%(orig_name)s)%(ext)s' % elem 
    cv2.imwrite(filename, img) 
print(curr_path) 
>>> ./output\1-cropped 
print(com_path) 
>>> ./ 

Как ни странно, при использовании (изначально я написал здесь curr_path вместо com_path, что было ошибкой):

filename = com_path + 'p_%(p_num)s, (%(orig_name)s)%(ext)s' % elem 

Все работает просто отлично, и сохраняет нужные файлы в папку сценария .py.

Из чего я собираю другие темы и официальную документацию, это должно сработать - почему бы и нет?

EDIT: согласно запросу:

print(os.getcwd()) 
>>> C:\Users\iyoossaev\Desktop\Index Cards\tester 

, где он должен быть

print(filename) 
>>> ./p_71, (p0089).png 
>>> ./p_72, (p0090).png 
>>> ./p_73, (p0091).png 
>>> ./p_74, (p0092).png 

Файлы не пусты, когда я использую "com_path" все работает (как для загрузки и сохранения) они как ожидалось. Изменение папки сохранения приводит к сбоям (без изменения каталога загрузки).

EDIT 2: Я решил вставить весь код, чтобы быть уверенным. Программа предназначена для загрузки изображений, конвертирования их в B & W, найдите соответствующий текст с использованием среднего значения пикселей в строке/cols и обрезайте их, а затем сохраните результаты с измененным именем. Все работает, за исключением случаев, когда я пытаюсь поместить их в подпапку. Пример изображения для теста: http://imgur.com/X2mPZr0

# IndexCardSplitter 
import cv2  # biblioteka do obróbki 
import os  # operating system-specific 
import re  # RegEx 
import numpy # obliczenia matematyczne 

p_num_off = -18 
t_thresh_hor = 210.0 
t_thresh_ver = 240.0 
t_thresh_m = 25 


com_path = os.getcwd() 
# com_path = '.' 
filenames = os.listdir(com_path) 
filenames = [ f for f in filenames if os.path.isfile(os.path.join(com_path, f)) and re.match('[^\_]*\.png$', f) ] 

out_f = "output" 
crop_f = "1-cropped" 
col_f = "2-columns" 
def_f = "3-definitions" 


def name_mod(filename): 
    elements = re.match("(p0{1,}([1-9][^\.]*?))(\.....?$)", filename) 
    orig_name = elements.group(1) 
    p_num = str(int(elements.group(2)) + p_num_off) 
    ext = elements.group(3) 
    return{'orig_name':orig_name, 'p_num':p_num, 'ext':ext} 


def load_images(filenames): 
    images = [] 
    for f in filenames: 
     print(f) 
     img_t = cv2.imread(os.path.join(com_path,f), cv2.IMREAD_GRAYSCALE) 
     thresh, img_t = cv2.threshold(img_t, 128, 255, cv2.THRESH_OTSU) 
     dictionary = name_mod(f) 
     dictionary['img'] = img_t 
     images.append(dictionary) 
    return images 


def img_trim(image): 
    height, width = image.shape 
    height = height - 1 
    width = width - 1 

    top_trim = 0 
    bot_trim = height 
    left_trim = 0 
    right_trim = width 

    i = 0   # GÓRA 
    while i < height and top_trim == 0: 
     row = image[i, 0:-1] 
     if numpy.mean(row) < t_thresh_hor: 
      top_trim = i 
     i = i + 1 

    i = height  # DÓŁ 
    while i > 0 and bot_trim == height: 
     row = image[i, 0:-1] 
     if numpy.mean(row) < t_thresh_hor: 
      bot_trim = i 
     i = i - 1 

    i = 0   # LEWO 
    while i < width and left_trim == 0: 
     col = image[0:-1, i] 
     if numpy.mean(col) < t_thresh_ver: 
      left_trim = i 
     i = i + 1 

    i = width  # PRAWO 
    while i > 0 and right_trim == width: 
     col = image[0:-1, i] 
     # col = image[0:-1, 2700] 
     if numpy.mean(col) < t_thresh_ver: 
      right_trim = i 
     i = i - 1 

    top_trim = top_trim - t_thresh_m 
    bot_trim = bot_trim + t_thresh_m 
    left_trim = left_trim - t_thresh_m 
    right_trim = right_trim + t_thresh_m 

    image = image[top_trim:bot_trim, left_trim:right_trim] 
    return(image) 


print('*'*40) 

# curr_path = os.path.join(os.getcwd(), out_f, crop_f) 
# print(curr_path) 
print(com_path) 
for elem in images: 
    img = img_trim(elem['img']) 
    # filename = os.path.join(os.getcwd(), out_f, crop_f, 'p_%(p_num)s, (%(orig_name)s)%(ext)s' % elem) 
    filename = com_path + 'p_%(p_num)s, (%(orig_name)s)%(ext)s' % elem 
    print(filename) 
    cv2.imwrite(filename, img) 

Входные имена файлов: p0089.png, p0090.png т.д.

+1

Возможно, «образы» - это пустой список? Поместите 'print (filename)' в ваш цикл. Или, может быть, ваш текущий рабочий каталог - это не то, что вы ожидаете? Поместите 'print (os.getcwd()) где-нибудь. В противном случае, пожалуйста, отредактируйте свой вопрос, включив в него короткую ** ** программу **, которая демонстрирует проблему. См. [Mcve] для получения дополнительной информации. –

+1

Не должно быть 'filename = os.path.join (curr_path, 'p_% (p_num) s, ...'% elem)'? –

+0

Обновлено согласно запросу. @Rawing делать то, что вы предложили, было моим первоначальным способом, но он делает то же самое - то есть, ошибка не возвращается, кажется, все в порядке, но папка/файлы нигде не найдены. – MrVocabulary

ответ

1

com_path Попробуйте установить на '' или os.getcwd(). os.path.join не заменяет косые черты с помощью os.sep.

+0

Использование 'com_path = os.getcwd()' заставляет меня получить следующий результат печати: 'C: \ Users \ iyoossaev \ Desktop \ Index Cards \ testerp_71, (p0089) .png', но с использованием'. .'' отлично работает, заставив меня напечатать: '.p_71, (p0089) .png' (и они появляются с этой точкой спереди в рабочем каталоге). Использование 'filename = os.path.join (os.getcwd(), out_f, crop_f, 'p_% (p_num) s, (% (orig_name) s)% (ext) s'% elem)' печатать идеальный путь, но ничего не происходит с файлами ... – MrVocabulary

+1

похоже, что вы изменили на использование '+' вместо 'os.path.join'. 'Os.path.join' будет конкатенировать элементы пути и имя файла, используя системный разделитель ('os.sep'). Это «\» в Windows и «/» в Unix. Я не думаю, что 'filename = com_path + 'p_% (p_num) s, (% (orig_name) s)% (ext) s'% elem' помещает разделители в. Если вы хотите сделать это« вручную », и создайте полное имя пути самостоятельно, вы также должны добавить символ разделителя ('os.path') между элементами пути. –

+0

Хорошо, этот последний комментарий к вам был тем, что мне нужна моя немая задница - теперь это работает как шарм :) Но я также предположил, что запись файла в несуществующую подпапку автоматически создаст его ... – MrVocabulary