Python os.path.join() - tidak akan digabungkan dengan benar

Saya ingin menyimpan beberapa file dalam subdirektori dari direktori saat ini, tetapi untuk alasan apa pun, meskipun Python "berhasil" menyimpan file keluaran, direktori tersebut tidak muncul di mana pun.

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)
>>> ./

Anehnya, saat menggunakan (awalnya saya menulis di sini curr_path alih-alih com_path, yang merupakan kesalahan):

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

Semuanya berfungsi dengan baik dan menyimpan file yang diinginkan di folder skrip .py.

Dari apa yang saya kumpulkan dari thread lain dan dokumentasi resmi, ini seharusnya berhasil—mengapa tidak?

EDIT: sesuai permintaan:

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

di mana seharusnya

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

File tidak kosong, ketika saya menggunakan "com_path" semuanya berfungsi (untuk memuat dan menyimpan) file dihasilkan seperti yang diharapkan. Mengubah direktori penyimpanan akan mengacaukan segalanya (tanpa mengubah direktori pemuatan).

EDIT 2: Saya memutuskan untuk menempelkan seluruh kode hanya untuk memastikan. Program ini dimaksudkan untuk memuat gambar, mengonversinya menjadi Hitam & Putih, menemukan relevansi teks menggunakan rata-rata piksel dalam baris/kolom dan memangkasnya, lalu menyimpan hasilnya dengan nama yang dimodifikasi. Semuanya berfungsi kecuali ketika saya mencoba memasukkannya ke dalam subfolder. Contoh gambar untuk diuji: https://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)

Nama file masukan adalah: p0089.png, p0090.png dll.


person MrVocabulary    schedule 14.02.2017    source sumber
comment
Mungkin images adalah daftar kosong? Masukkan print(filename) di lingkaran Anda. Atau mungkin direktori kerja Anda saat ini tidak sesuai dengan harapan Anda? Letakkan print(os.getcwd()) di suatu tempat. Jika tidak, harap edit pertanyaan Anda untuk menyertakan program singkat, lengkap yang menunjukkan masalahnya. Lihat contoh minimal yang dapat direproduksi untuk info lebih lanjut.   -  person Robᵩ    schedule 15.02.2017
comment
Bukankah seharusnya itu filename = os.path.join(curr_path, 'p_%(p_num)s, ...'%elem)?   -  person Aran-Fey    schedule 15.02.2017
comment
Diperbarui sesuai permintaan. @Rawing melakukan apa yang Anda sarankan adalah cara asli saya, tetapi ia melakukan hal yang sama—yaitu, tidak ada kesalahan yang muncul, sepertinya semuanya baik-baik saja, tetapi folder/file tidak dapat ditemukan.   -  person MrVocabulary    schedule 15.02.2017
comment
Sudahkah Anda mencoba mengganti com_path = './' dengan com_path = 'os.getcwd()' ? Jika tidak, Anda ingin yakin dengan keputusan './'!   -  person Son of a Beach    schedule 15.02.2017
comment
@Son of a Beach yang saya miliki, dan hasilnya aneh—silakan lihat posting saya yang diperbarui dan jawaban saya untuk Dmitry Rubanovich.   -  person MrVocabulary    schedule 15.02.2017


Jawaban (1)


Coba atur com_path ke '.' atau os.getcwd(). os.path.join tidak menggantikan garis miring dengan os.sep.

person Dmitry Rubanovich    schedule 14.02.2017
comment
Menggunakan com_path = os.getcwd() membuat saya mendapatkan hasil cetak berikut: C:\Users\iyoossaev\Desktop\Index Cards\testerp_71, (p0089).png tetapi menggunakan '.' berfungsi dengan baik, membuat saya mencetak: .p_71, (p0089).png (dan muncul dengan titik itu di depan direktori yang berfungsi). Menggunakan filename = os.path.join(os.getcwd(), out_f, crop_f, 'p_%(p_num)s, (%(orig_name)s)%(ext)s' % elem) mencetak jalur yang sempurna, tetapi tidak ada yang terjadi dengan file… - person MrVocabulary; 15.02.2017
comment
sepertinya Anda berubah menggunakan + daripada os.path.join. os.path.join akan menggabungkan elemen jalur dan nama file menggunakan pemisah khusus sistem (os.sep). Itu '\' di Windows dan '/' di Unix. Saya tidak berpikir filename = com_path + 'p_%(p_num)s, (%(orig_name)s)%(ext)s' % elem akan memasukkan pemisah. Jika Anda ingin melakukannya dengan tangan dan membuat sendiri nama jalur lengkap, Anda juga harus menambahkan karakter pemisah (os.path) di antara elemen jalur. - person Dmitry Rubanovich; 16.02.2017
comment
Oke, komentar terakhir Anda inilah yang dibutuhkan oleh orang bodoh saya—sekarang berfungsi dengan baik :) Tapi saya juga berasumsi bahwa menulis file ke subfolder yang tidak ada akan secara otomatis membuatnya… - person MrVocabulary; 16.02.2017