2016-03-25 30 views
2

Belirli bir dizinden birden fazla pdf dosyası açmak istiyorum. Bu dosyaların adı bir csv dosyasından alınmış ve csv ile pdf dosyasının adı arasındaki her eşleşmeyi açmıştır.Python ile birden çok pdf dosyasını açın

Sorunum, yalnızca ilk eşleşmenin tamamı açılmamasıdır. Bunu nasıl düzeltebilirim?

Denedim kodu:

import csv 
import os 
from pathlib import * 

file1=open('CSV file.csv','r') 
reader=csv.reader(file1,delimiter=';') 
file_name=[] 

dir_path = Path('C:\\path\\of\\directory') 
pdf_files = dir_path.glob('*.pdf') 

for item in reader: 
    file_name=item[1] 
    print(file_name)#just to see the file name that I want to open 
    for pdffile in pdf_files: 
     if item[1] in pdffile.name: 
      os.startfile("%s"%(pdffile)) 

file1.close() 
+0

Üzgünüm Yanılmışım –

+0

PDF dosyalarını açmak istediğinizi söylediğinizde, ne demek istiyorsunuz? Bir şekilde onlardan bilgi almayı mı, yoksa belki de bunları bir PDF görüntüleyicide mi başlatmak istiyorsunuz? –

+0

İkinci seçenek .. teşekkür ederim! –

cevap

0

potansiyel dosya adı lettercase sorunların göz ardı yalnızca bir pdf dosyası açılıyor nedendir dir_path.glob('*.pdf') getiri iç içe geçmiş for pdffile in pdf_files: döngü kullanarak birden çok kez yineleme girişiminde bir generator nesne çünkü.

Bunu düzeltmenin en kolay yolu, jeneratörü, birden çok kez yinelenebilen list gibi bir sıra nesnesine dönüştürmektir. Bunu aşağıdaki kodda yaptım, düzeltildi veya birkaç şeyi basitleştirdim.

import csv 
import os 
from pathlib import * 

dir_path = Path('C:\\path\\of\\directory') 
pdf_files = list(dir_path.glob('*.pdf')) # convert result to a list 

with open('CSV file.csv', newline='') as file1: 
    for row in csv.reader(file1, delimiter=';'): 
     file_name = row[1] 
     print(file_name) 
     for pdffile in pdf_files: 
      if file_name in pdffile.name: 
       os.startfile(str(pdffile)) 
       break 
+0

Teşekkür ederim! ... şimdi istediğim gibi çalışıyor. –

0

Ben csv dosyasında dosya adları üzerinde yineleme ve dosya varsa her zaman kontrol etmek önermek yerine dizinde var olan dosyalarla başka bir liste oluşturma. Bu kontrol için os.path.isfile()'u kullanabilirsiniz.

İşte bir örnek:

import csv 
import os 

# access list with file names 
with open('file1.csv', 'r') as file1: 
    reader=csv.reader(file1,delimiter=';') 

# iterate over files and open them 
for item in reader: 
    if os.path.isfile(item): 
     print item 
     os.startfile(item) 

with open() formalizmini kullanarak, sonradan dosyayı kapatmadan rahatsız gerekmez.

+0

Bu durumda, csv yolu pdf dosya dizini yolu ile aynı olmalıdır? –

+0

Daha spesifik olmak gerekirse ... csv dosyası bir kod sağlar ve belirli bir dizinden pdf dosyasının eşleşmesi veya içerdiği pdf dosyasının içerdiği dosya kodu –

+0

ise "item" mutlaktır ('C:/gibi bir şey://path/file1.pdf '), cevabımdaki kodu kullanabilirsiniz. Ancak, 'öğe' dosya adı göreli (_file1.pdf_ gibi) ise, dosyaların geçerli çalışma dizininde olması gerekir. Aksi takdirde, bir "yol dizgisini" kendi dosya dizginize kolayca bağlayabilirsiniz: 'fullpath = yol + dosyaadı' –

0

Aşağıdakiler istediğiniz şeyi yapmalıdır. İlk önce CSV dosyasındaki ikinci sütun girişlerini okur ve aranacak tüm dosya isimlerini tutan küçük harfli bir set oluşturur. Ardından, seçtiğiniz klasörden PDF dosyalarının bir listesini almak için glob.glob() işlevini kullanır. Son olarak, dosyanın gerekli pdf_filenames listesinde olup olmadığını kontrol eder ve eğer varsa, kabuğu kullanarak başlatır.

import subprocess  
import glob  
import csv 
import os 

folder = r'C:\path\of\directory\*.pdf' 

# Read the list of PDF filenames from the CSV 
with open('CSV file.csv','r') as f_pdf_list: 
    pdf_filenames = set(row[1].lower() for row in csv.reader(f_pdf_list, delimiter=';')) 

# Get the list of files in the folder  
for pdf_file in glob.glob(folder): 
    pdf_file = os.path.basename(pdf_file).lower() 

    if pdf_file in pdf_filenames: 
     subprocess.Popen([pdf_file], shell=True) 

Not, Windows büyük/küçük harf duyarlı olmadığından dosya adlarının tümünü küçültüyorum.

+0

cevabınız için teşekkür ederiz, ama hiçbir pdf dosyası açık değil .... kodumu –

+0

kod ile açmayı başardı biri gibi görünüyor ben csv dosya sadece yol adını değil, yolunu içerir. Senaryoyu değiştirdim. –

+0

Tam olarak ... benim csv sadece pdf dosyalarını içerir –

İlgili konular