İsme göre listeyi sıralamak

Niyetim elimdeki pek çok odt belgesini pdf’e çevirmek ve bunları birleştirmek. Alelade şöyle bir kod yazdım:

#!/usr/bin/env python3

def dosyalar():
    import os
    return [dosya for dosya in os.listdir(".")]

def pdf_çevir(dosya_adı):
    import subprocess
    return subprocess.call("unoconv -f pdf {}".format(dosya_adı))

def seç(dosyalar,uzantı):
    mahmut=[]
    for dosya in dosyalar:
        if dosya.endswith(uzantı):
            mahmut.append(dosya)
    return mahmut

def birleştir(dosyalar):
    import subprocess
    return subprocess.call("pdfunite {} birleşmişdosya.pdf".format(dosyalar))

def toplu_çevir(argüman):
    for dosya in argüman:
        pdf_çevir(dosya)
        print("{} çeviriliyor.".format(dosya))
        
def çalıştır():
    print("Bu program odt belgelerinizi tek bir pdf olarak birleştirir.")
    odt_dosyaları=[dosya for dosya in seç(dosyalar(),"odf")]
    toplu_çevir(odt_dosyaları)
    pdf_dosyaları=[dosya for dosya in seç(dosyalar(),"pdf")]
    birleştir(pdf_dosyaları)
    
çalıştır()
print("Tamamlandı!")

Lakin bu belgelerin rastgele birleşmemesi, isim sırasına göre eklenerek birleşmesi gerekiyor. Bunu nasıl yapabiliriz? Ayrıca yazdığım kodları çalıştırınca şöyle bir hata alıyorum:

Bu program odt belgelerinizi tek bir pdf olarak birleştirir.
Traceback (most recent call last):
  File "pdfçeviri.py", line 34, in <module>
    çalıştır()
  File "pdfçeviri.py", line 32, in çalıştır
    birleştir(pdf_dosyaları)
  File "pdfçeviri.py", line 20, in birleştir
    return subprocess.call("pdfunite {} birleşmişdosya.pdf".format(dosyalar))
  File "/usr/lib64/python3.4/subprocess.py", line 534, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/usr/lib64/python3.4/subprocess.py", line 856, in __init__
    restore_signals, start_new_session)
  File "/usr/lib64/python3.4/subprocess.py", line 1460, in _execute_child
    raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'pdfunite [] birleşmişdosya.pdf'

Sorun neyden kaynaklanıyor? Ayrıca bu istek biraz şımarıklık olarak algılanabilir ama, vaktim kısıtlı olduğu için bu kodları çalışır kod haline getirebilir misiniz? :slight_smile: Teşekkür ederim.

Bence sorun birlestir fonksiyonunda.Ipler orda kopuyor.Sen asagidaki fonksiyonda

def birleştir(dosyalar):
    import subprocess
    return subprocess.call(“pdfunite {} birleşmişdosya.pdf”.format(dosyalar))
    

dosyalar parametresi string olmali.Ama sen calistir fonksiyonunda soyle bir sey yapmissin.

pdf_dosyaları=[dosya for dosya in seç(dosyalar(),“pdf”)]
birleştir(pdf_dosyaları)

yani burada birlestir fonksiyonun parametresi string olmasi gerekirken liste olmus.Zaten hatada soyle bir ifade var.

FileNotFoundError: [Errno 2] No such file or directory: ‘pdfunite [] birleşmişdosya.pdf’

Dikkat et orada pdfunite den hemen sonra bos bir liste var.Hatanin bundan kaynaklandigini dusunuyorum.Ama yanlis da dusunuyor olabilirim.Kodlari calistirilabilir kod haline donusturmeye gelince:
İs ustundeyim.Yaparsam buraya atarim kodu.Kusura bakmayin.Bi ihtmal hatayi bulmama ragmen yine de cozemedim su anlık sorunu is ustundeyim.

import os
import subprocess


class pdf_program():

    def __init__(self,uzanti):
        self.uzanti = uzanti
        self.karsilastirma = []
        self.tum_dosyalar = os.listdir(".")
        self.sec()
        self.donusecekleri_bul()
        self.toplu_pdf_donustur()
        self.pdf_birlestir()

    def pdf_donustur(self,dosya):
        subprocess.call("unoconv -f pdf " + dosya)
        
    
    def sec(self):
        self.asil_dosyalar = []
        for i in self.tum_dosyalar:
            if i.endswith(self.uzanti):
                self.asil_dosyalar.append(i)
                
                
                
    def toplu_pdf_donustur(self):
        for i in self.asil_dosyalar:            
            self.pdf_donustur(i)
            
    def donusecekleri_bul(self):
        self.karsilastirma = []
        
        for i in self.tum_dosyalar:
            self.asil_dosyalar.append(i)
            self.donusecekler = os.path.split(i)
            self.donusecekler = self.donusecekler[1]
            self.donusecekler = os.path.splitext(self.donusecekler)       
            self.donusecekler = self.donusecekler[0]
            self.karsilastirma.append(self.donusecekler)
            
    def pdf_birlestir(self):
        for i in self.tum_dosyalar:
            
            self.belirleme = os.path.split(i)
            self.belirleme = self.belirleme[1]
            self.belirleme = os.path.splitext(self.belirleme)       
            self.belirleme = self.belirleme[0]
            birlestirilen = []                    
            if self.belirleme in self.karsilastirma:
                birlestirilen.append(i)
        son_islem_dosyasi = " ".join(birlestirilen)
        subprocess.call("pdfunite {} son_dosyamiz.pdf".format(son_islem_dosyasi))
        
        
#pdf_program("otd") # ornegin

Kusura bakmayın.Yapamadim.Ama belki buradaki hatayi gorerek daha iyisini yapabilirsiniz.Bir deneyin bunu.

Listelerde sort() metodu var bu isi goren.Hataya yogunlastıgım icin gorememisim bu soruyu.Ama turkce karakterlerde biraz sıkıntı veriyor bu metod,dikkat edin.Bu metod icin Fırat Özgül’ün pdf sine bakılabilir.

İlginiz için teşekkür ederim, hata aslında gayet basitmiş. Odt yerine odf yazdığım için kodlardaki mahmut isimli liste boş kalıyor, haliyle epey sorunlu bir iş oluyor. Ayrıca subprocess.call fonksiyonu da bir uygulamayı herhangi bir parametre olmadan çağırmaya yarıyor. Bunun yerine os.system fonksiyonunu kullanmak gerekiyormuş. Şimdilik çalışır halde olan bir şöyle bir şey yazdım. sort() fonksiyonuna şimdi bakacağım.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
 
def dosyalar():
    import os
    return [dosya for dosya in os.listdir(".")]

 
def pdf_çevir(dosya_adı):
    import os
    return os.system("unoconv -f pdf {}".format(dosya_adı))
 
 
def seç(dosyalar, uzantı):
    mahmut=[]
    for dosya in dosyalar:
        if dosya.endswith(uzantı):
            mahmut.append(dosya)
    return mahmut

 
def birleştir(dosyalar):
    import os
    return os.system("pdfunite {} birleşmişdosya.pdf".format(dosyalar))


def toplu_çevir(argüman):
    for dosya in argüman:
        pdf_çevir(dosya)
        print("{} çeviriliyor.".format(dosya))
        
def çalıştır():
    print("Bu program odt belgelerinizi tek bir pdf olarak birleştirir.")
    odt_dosyaları=[dosya for dosya in seç(dosyalar(),"odt")]
    toplu_çevir(odt_dosyaları)
    pdf_dosyaları=[dosya for dosya in seç(dosyalar(),"pdf")]
    birleştir(pdf_dosyaları)
    

çalıştır()
print("Bitti!")

Şimdi sorun şurada, dosyalarda bir boşluk varsa Linux konsolunda şöyle yazmalıyız:

-Hede\ hödö.uzantı

Eğer \ işaretini kullanmazsak Linux’ta boşluktan sonrası kıymet görmez. Haliyle yazdığımız program sadece “hede” isimli bir dosya arayıp onu çevirmeye çalışır ki bu bir sorun. Python dosyaları güzelce okuyor ama belgeleri "Hede\ " şeklinde ayırmadığı için bir çatışma oluyor. Bu arada ben pes edip belgeleri elle çeviriyorum, ama ilgilenirseniz de hala daha ilgileniyorum konuyla.

1 Beğeni

Aklıma sorun olan seylerden de birisi buydu biliyor musunuz?Aydınlattıgınız icin sagolun.Bende yeni bir cıgır actınız.Maalesef en fazla saat 4 e kadar ilglenebilirim.Ama ilgilenmeye calisacagim.

1 Beğeni
import os
#import subprocess


class pdf_program():

    def __init__(self,uzanti):
        self.uzanti = uzanti
        self.karsilastirma = []
        self.tum_dosyalar = os.listdir(".")
        self.sec()
        self.donusecekleri_bul()
        self.toplu_pdf_donustur()
        self.pdf_birlestir()

    def pdf_donustur(self,dosya):
        os.system("unoconv -f pdf " + dosya)
        
    
    def sec(self):
        self.asil_dosyalar = []
        for i in self.tum_dosyalar:
            if i.endswith(self.uzanti):
                self.asil_dosyalar.append(i)
                self.asil_dosyalar.sort()
                
                
                
    def toplu_pdf_donustur(self):
        for i in self.asil_dosyalar:
            if " " in i:
                i = i.replace(" ","//")           
                self.pdf_donustur(i)
            else:
                self.pdf_donustur(i)
            
            
    def donusecekleri_bul(self):
        self.karsilastirma = []
        
        for i in self.tum_dosyalar:
            self.asil_dosyalar.append(i)
            self.donusecekler = os.path.split(i)
            self.donusecekler = self.donusecekler[1]
            self.donusecekler = os.path.splitext(self.donusecekler)       
            self.donusecekler = self.donusecekler[0]
            self.karsilastirma.append(self.donusecekler)
            
    def pdf_birlestir(self):
        for i in self.tum_dosyalar:
            
            self.belirleme = os.path.split(i)
            self.belirleme = self.belirleme[1]
            self.belirleme = os.path.splitext(self.belirleme)       
            self.belirleme = self.belirleme[0]
            birlestirilen = []                    
            if self.belirleme in self.karsilastirma:
                if " " in i:
                    i = i.replace(" ","//")
                birlestirilen.append(i)
        son_islem_dosyasi = " ".join(birlestirilen)
        os.system("pdfunite {} son_dosyamiz.pdf".format(son_islem_dosyasi))
        
        
#pdf_program("odt") # ornegin

Dediginize gore ufak bir duzenleme yaptim(gerci buna düzenleme denilmez de) ama olur mu,olmaz mı bilemem(odt belgelerinize zarar vermek istemem).Hata vermiyor.(Ama turkce karakterlerde sorun yasarsınız bu kodla)

1 Beğeni

Teşekkür ederim, keşke daha önce görseydim. Zaman azalıyor diye bütün belgeleri tek tek elimle çevirdim. İsterseniz çalışıp çalışmadığını gelişigüzel belgeler üstünde test edebilirim.

Maalesef elimde odt belgesi yok.Deneyin isterseniz.
Bu arada cözüm olarak isaretlemissiniz gonderimi.Sahsen cözüm oldugunu dusunmuyorum.:grin: