使用python打开多个pdf文件

时间:2016-03-25 11:27:07

标签: python csv python-3.x pdf

我想从特定目录打开多个pdf文件。这些文件的名称取自csv文件,并在csv和pdf文件名称之间打开。

我的问题是只有第一场比赛才开启。我怎么能解决这个问题?

我尝试的代码:

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()

3 个答案:

答案 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()形式,您不必在以后关闭文件。

答案 1 :(得分:0)

以下应该做你想要的。首先,它从CSV文件读入第二列条目,并创建一个包含要搜索的所有文件名的小写集。接下来,它使用glob.glob()函数从您选择的文件夹中获取PDF文件列表。最后,它会检查文件是否在所需的pdf_filenames列表中,如果是,则使用shell启动它们。

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不区分大小写。

答案 2 :(得分:0)

忽略潜在的文件名字母集问题,原因只有一个pdf文件被打开是因为dir_path.glob('*.pdf')返回一个generator对象,您尝试使用嵌套的for pdffile in pdf_files:循环多次迭代

解决这个问题的最简单方法是将生成器转换为序列对象,如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