python glob或listdir创建文件,然后将文件从一个目录保存到另一个目录

python glob或listdir创建文件,然后将文件从一个目录保存到另一个目录,python,directory,glob,listdir,Python,Directory,Glob,Listdir,我正在将文档从pdf转换为文本。PDF当前位于一个文件夹中,然后在txt转换后保存到另一个文件夹中。我有很多这样的文档,我更喜欢在子文件夹上迭代并保存到txt文件夹中同名的子文件夹中,但添加该层时遇到问题 我知道我可以使用glob递归地进行迭代,并对文件列表等执行此操作,但不清楚如何将文件从此文件夹保存到新文件夹。这不是完全必要的,但会更加方便和高效 有什么好办法吗 import os import io from pdfminer.pdfinterp import PDFResourceMan

我正在将文档从pdf转换为文本。PDF当前位于一个文件夹中,然后在txt转换后保存到另一个文件夹中。我有很多这样的文档,我更喜欢在子文件夹上迭代并保存到txt文件夹中同名的子文件夹中,但添加该层时遇到问题

我知道我可以使用glob递归地进行迭代,并对文件列表等执行此操作,但不清楚如何将文件从此文件夹保存到新文件夹。这不是完全必要的,但会更加方便和高效

有什么好办法吗

import os
import io
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage


def convert(fname, pages=None):
    if not pages:
        pagenums = set()
    else:
        pagenums = set(pages)

    output = io.StringIO()
    manager = PDFResourceManager()
    converter = TextConverter(manager, output, laparams=LAParams())
    interpreter = PDFPageInterpreter(manager, converter)

    infile = open(fname, 'rb')
    for page in PDFPage.get_pages(infile, pagenums):
        interpreter.process_page(page)
    infile.close()
    converter.close()
    text = output.getvalue()
    output.close
    return text 
    print(text)



def convertMultiple(pdfDir, txtDir):
    if pdfDir == "": pdfDir = os.getcwd() + "\\" #if no pdfDir passed in 
    for pdf in os.listdir(pdfDir): #iterate through pdfs in pdf directory
        fileExtension = pdf.split(".")[-1]
        if fileExtension == "pdf":
            pdfFilename = pdfDir + pdf 
            text = convert(pdfFilename)  
            textFilename = txtDir + pdf.split(".")[0] + ".txt"
            textFile = open(textFilename, "w")  
            textFile.write(text)  


pdfDir = r"C:/Users/Documents/pdf/"
txtDir = r"C:/Users/Documents/txt/"
convertMultiple(pdfDir, txtDir)   

正如您所建议的,
glob
在这里工作得很好。它甚至只能过滤
.pdf
文件

在测试后取消对这3行的注释

导入操作系统,全局
def convert_multiple(pdf_目录、txt_目录):
如果pdf_dir==“”:pdf_dir=os.getcwd()#如果没有传入pdf_dir
对于glob.iglob(f“{pdf_dir}/***.pdf”,recursive=True)中的文件路径:
text=convert(文件路径)
根目录,z=os.path.splitext(filepath)#删除扩展名
txt_filepath=os.path.join(txt_dir,os.path.relpath(root,pdf_dir))+“.txt”
txt_filepath=os.path.normpath(txt_filepath)#实际上不需要
打印(txt_文件路径)
#os.makedirs(os.path.dirname(txt\u filepath),exist\u ok=True)
#打开(txt_文件路径,“wt”)作为f:
#f.书写(文本)
pdf_dir=r“C:/Users/Documents/pdf/”
txt_dir=r“C:/Users/Documents/txt/”
转换多个(pdf目录、txt目录)
要确定新
.txt
文件的文件路径,请使用模块中的函数

os.path.relpath(filepath,pdf\u dir)
返回文件的文件路径,包括相对于
pdf\u dir的任何子目录

假设
filepath
为:

C:/Users/Documents/pdf/Setec Astronomy/employees.pdf

pdf_dir

C:/Users/Documents/pdf/

它将返回
Setec Astronomy/employees.pdf
,然后将其与
txt\u dir
一起传递到
os.path.join()
,为我们提供包含额外子目录的完整文件路径

您可以执行
txt\u filepath=filepath.replace(filepath,pdf\u dir)
,但必须确保所有对应的斜杠都在同一方向,并且没有额外的/缺少的前导/尾随斜杠

在打开新的
.txt
文件之前,需要创建所有子目录<调用code>os.path.dirname()获取文件目录的文件路径,如果目录已经存在,则调用
os.makedirs()
并将其
exist\u ok
参数设置为
True
,以抑制
fileexisterror
异常


打开
.txt
文件时使用
with
语句,以避免显式调用
.close()
,尤其是在出现任何异常的情况下。

因此,如果在子目录(例如
C:/Users/Documents/pdf/Setec Astronomy/employees.pdf
)中找到pdf,您想将文本文件保存到
C:/Users/Documents/txt/Setec Astronomy/employees.pdf
还是
C:/Users/Documents/txt/employees.pdf
?@GordonAitchJay第一个文本文件是C:/Users/Documents/txt/Setec Astronomy/employees.txt,程序负责文本部分