2016-03-25 11 views
2

特定のディレクトリから複数のpdfファイルを開きたいのですが、これらのファイルの名前はcsvファイルから取得され、csvとpdfファイルの名前が一致するものが開きます。複数のPDFファイルをPythonで開く

私の問題は、最初の試合だけがすべてではなく開かれていることです。どうすれば修正できますか?

私が試しコード:

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

申し訳ありませんが、私は間違っていました。 –

+0

あなたはPDFファイルを開きたいと言ったら、どういう意味ですか?何らかの形で情報を抽出したいのですか、あるいはそれらをPDFビューアで起動するのでしょうか? –

+0

2番目のオプション..ありがとう! –

答えて

0

、唯一の1つのPDFファイルが開かれている理由があります。

これを解決する最も簡単な方法は、ジェネレータをlistのようなシーケンスオブジェクトに変換することです。このオブジェクトは複数回反復処理できます。私は以下のコードでこれを行いましたが、他のいくつかの修正や簡略化が行われました。

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

ありがとうございました! –

0

私はあなたのcsvファイル内のファイル名を反復して、ファイルが存在する場合は、すべての時間をチェックすることをお勧めし、代わりにディレクトリ内の既存のファイルと別のリストを作成します。その確認にos.path.isfile()を使用できます。

はここに例を示します

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()形式主義を使用することにより、あなたはその後、ファイルを閉じて気にする必要はありません。

+0

この場合、csvのパスはpdfファイルのディレクトリのパスと同じにする必要がありますか? –

+0

具体的には... csvファイルはコードを提供していますが、ファイル名に対応するpdfファイルを特定のディレクトリから開きたいとします。 –

+0

'item'が絶対的であれば(C: /path/file1.pdf ')、私の答えにコードを使用することができます。 ファイル名 'item'が相対ファイル(_file1.pdf_のように)の場合、ファイルは現在の作業ディレクトリになければなりません。そうでなければ、あなたのファイル名文字列に "path-string"を簡単に接続することができます: 'fullpath = path + filename' –

0

次のようにしてください。最初に、CSVファイルから2番目の列エントリを読み込み、検索するファイル名のすべてを保持する小文字のセットを作成します。次に、glob.glob()関数を使用して、選択したフォルダからPDFファイルのリストを取得します。最後に、ファイルが必要なリストの中にあるかどうかをチェックし、もしそうであれば、シェルを使ってファイルを起動します。

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) 

Windowsでは大文字と小文字を区別しないため、すべてのファイル名を小文字にしています。 dir_path.glob('*.pdf')は、ネストされたfor pdffile in pdf_files:ループを使用して複数回の反復処理しようとgeneratorオブジェクトを返すので、潜在的なファイル名のレターケースの問題を無視する

+0

あなたの答えに感謝しますが、pdfファイルが開かれていないようです....私のコードで開くことはできませんでした –

+0

私のCSVファイルはパス名ではないと思います。スクリプトを修正しました。 –

+0

まさに...私のcsvには、pdfファイルの名前だけが含まれています –

関連する問題