使用 os.walk 为每个目录创建一个文件列表
Using os.walk to create a filelist for each directory
我正在尝试使用 os.walk 创建每个子目录的文件列表,并执行一个函数来合并每个目录列表中的所有 pdf。当前脚本在每个循环中将后续目录附加到现有列表中。因此,directory1 中的 pdf 已成功合并,但是 directory2 的列表包括 directory1 等中的 pdf。我希望它刷新每个目录的文件列表。这是我目前使用的脚本:
import PyPDF2
import os
import sys
if len(sys.argv) > 1:
SearchDirectory = sys.argv[1]
print("I'm looking for PDF's in ", SearchDirectory)
else:
print("Please tell me the directory to look in")
sys.exit()
pdfWriter = PyPDF2.PdfFileWriter()
for root, dirs, files in os.walk(SearchDirectory):
dirs.sort()
for file in files:
files.sort()
pdfFiles = []
if file.endswith('.pdf') and ((os.path.basename(root)) == "frames"):
print("Discovered this pdf: ", os.path.join(root, file))
pdfFiles.append(os.path.join(root, file))
if pdfFiles:
for file in pdfFiles:
pdfFileObj = open(file, 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
for pageNum in range(0, pdfReader.numPages):
pageObj = pdfReader.getPage(pageNum)
pdfWriter.addPage(pageObj)
pdfOutput = open((os.path.split(os.path.realpath(root))[0]) + ".pdf", "wb")
pdfWriter.write(pdfOutput)
pdfOutput.close()
print("The following pdf has been successfully appended:", os.path.join(root, file))
else:
print("No pdfs found in this directory:", root)
os.walk
循环对每个目录迭代一次。所以您想为每个目录创建一个新的 PDFWriter。
使用continue
尽快跳出循环也是个好主意,这样可以保持嵌套平坦。
大写字母开头的名字是为类预留的,所以应该是searchDirectory
,写成小s
.
最后,利用 with
块来处理 I/O - 它们会自动为您调用 .close()
。
我不会为了这个问题安装PyPDF2
,但是这个方法看起来很合理:
for root, dirs, files in os.walk(searchDirectory):
if not os.path.basename(root) == "frames":
continue
pdfFiles = [os.path.join(root, file) for file in sorted(files)]
if not pdfFiles:
continue
pdfWriter = PyPDF2.PdfFileWriter()
outputFile = os.path.split(os.path.realpath(root))[0] + ".pdf"
for file in pdfFiles:
print("Discovered this pdf:", file)
with open(file, 'rb') as pdfInput:
pdfReader = PyPDF2.PdfFileReader(pdfInput)
for page in pdfReader.pages:
pdfWriter.addPage(page)
with open(outputFile, "wb") as pdfOutput:
pdfWriter.write(pdfOutput)
print("%s files appended to %s" % (len(pdfFiles), outputFile))
我正在尝试使用 os.walk 创建每个子目录的文件列表,并执行一个函数来合并每个目录列表中的所有 pdf。当前脚本在每个循环中将后续目录附加到现有列表中。因此,directory1 中的 pdf 已成功合并,但是 directory2 的列表包括 directory1 等中的 pdf。我希望它刷新每个目录的文件列表。这是我目前使用的脚本:
import PyPDF2
import os
import sys
if len(sys.argv) > 1:
SearchDirectory = sys.argv[1]
print("I'm looking for PDF's in ", SearchDirectory)
else:
print("Please tell me the directory to look in")
sys.exit()
pdfWriter = PyPDF2.PdfFileWriter()
for root, dirs, files in os.walk(SearchDirectory):
dirs.sort()
for file in files:
files.sort()
pdfFiles = []
if file.endswith('.pdf') and ((os.path.basename(root)) == "frames"):
print("Discovered this pdf: ", os.path.join(root, file))
pdfFiles.append(os.path.join(root, file))
if pdfFiles:
for file in pdfFiles:
pdfFileObj = open(file, 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
for pageNum in range(0, pdfReader.numPages):
pageObj = pdfReader.getPage(pageNum)
pdfWriter.addPage(pageObj)
pdfOutput = open((os.path.split(os.path.realpath(root))[0]) + ".pdf", "wb")
pdfWriter.write(pdfOutput)
pdfOutput.close()
print("The following pdf has been successfully appended:", os.path.join(root, file))
else:
print("No pdfs found in this directory:", root)
os.walk
循环对每个目录迭代一次。所以您想为每个目录创建一个新的 PDFWriter。
使用continue
尽快跳出循环也是个好主意,这样可以保持嵌套平坦。
大写字母开头的名字是为类预留的,所以应该是searchDirectory
,写成小s
.
最后,利用 with
块来处理 I/O - 它们会自动为您调用 .close()
。
我不会为了这个问题安装PyPDF2
,但是这个方法看起来很合理:
for root, dirs, files in os.walk(searchDirectory):
if not os.path.basename(root) == "frames":
continue
pdfFiles = [os.path.join(root, file) for file in sorted(files)]
if not pdfFiles:
continue
pdfWriter = PyPDF2.PdfFileWriter()
outputFile = os.path.split(os.path.realpath(root))[0] + ".pdf"
for file in pdfFiles:
print("Discovered this pdf:", file)
with open(file, 'rb') as pdfInput:
pdfReader = PyPDF2.PdfFileReader(pdfInput)
for page in pdfReader.pages:
pdfWriter.addPage(page)
with open(outputFile, "wb") as pdfOutput:
pdfWriter.write(pdfOutput)
print("%s files appended to %s" % (len(pdfFiles), outputFile))