我想从特定目录打开多个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()
答案 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