如何将python代码一次应用于文件夹中的所有文件,以及如何为每个后续输出文件创建新名称?

如何将python代码一次应用于文件夹中的所有文件,以及如何为每个后续输出文件创建新名称?,python,parsing,for-loop,naming,pypdf,Python,Parsing,For Loop,Naming,Pypdf,我正在使用的代码接收.pdf文件,并输出.txt文件。我的问题是,如何创建一个循环(可能是for循环),在文件夹中以“.pdf”结尾的所有文件上反复运行代码?此外,如何在每次循环运行时更改输出,以便每次都可以编写与输入文件同名的新文件(即1_pet.pdf>1_pet.txt、2_pet.pdf>2_pet.txt等) 以下是迄今为止的代码: path="2_pet.pdf" content = getPDFContent(path) encoded = content.encode("utf-

我正在使用的代码接收.pdf文件,并输出.txt文件。我的问题是,如何创建一个循环(可能是for循环),在文件夹中以“.pdf”结尾的所有文件上反复运行代码?此外,如何在每次循环运行时更改输出,以便每次都可以编写与输入文件同名的新文件(即1_pet.pdf>1_pet.txt、2_pet.pdf>2_pet.txt等)

以下是迄今为止的代码:

path="2_pet.pdf"
content = getPDFContent(path)
encoded = content.encode("utf-8")
text_file = open("Output.txt", "w")
text_file.write(encoded)
text_file.close()

对目录中的所有PDF文件进行操作的一种方法是调用
glob.glob()
并迭代结果:

import glob
for path in glob.glob('*.pdf')
    content = getPDFContent(path)
    encoded = content.encode("utf-8")
    text_file = open("Output.txt", "w")
    text_file.write(encoded)
    text_file.close()
另一种方法是允许用户指定文件:

import sys
for path in sys.argv[1:]:
    ...

然后用户运行您的脚本,如
python foo.py*.pdf

创建一个函数,封装您要对每个文件执行的操作

import os.path

def parse_pdf(filename):
    "Parse a pdf into text"
    content = getPDFContent(filename)
    encoded = content.encode("utf-8")
    ## split of the pdf extension to add .txt instead.
    (root, _) = os.path.splitext(filename)
    text_file = open(root + ".txt", "w")
    text_file.write(encoded)
    text_file.close()
然后将此函数应用于文件名列表,如下所示:

for f in files:
    parse_pdf(f)

可以使用递归函数在文件夹和所有子文件夹中搜索以pdf结尾的文件。然后获取这些文件,然后为其创建一个文本文件

可能是这样的:

import os

def convert_PDF(path, func):
    d = os.path.basename(path)
    if os.path.isdir(path):
        [convert_PDF(os.path.join(path,x), func) for x in os.listdir(path)]
    elif d[-4:] == '.pdf':
        funct(path)

# based entirely on your example code
def convert_to_txt(path):
    content = getPDFContent(path)
    encoded = content.encode("utf-8")
    file_path = os.path.dirname(path)
    # replace pdf with txt extension
    file_name = os.path.basename(path)[:-4]+'.txt'
    text_file = open(file_path +'/'+file_name, "w")
    text_file.write(encoded)
    text_file.close()

convert_PDF('path/to/files', convert_to_txt)

由于实际操作是可变的,因此您可以使用需要执行的任何操作(如使用不同的库、转换为不同的类型等)替换函数。

以下脚本解决了您的问题:

import os

sourcedir = 'pdfdir'

dl = os.listdir('pdfdir')

for f in dl:
    fs = f.split(".")
    if fs[1] == "pdf":
        path_in = os.path.join(dl,f)
        content = getPDFContent(path_in)
        encoded = content.encode("utf-8")
        path_out = os.path.join(dl,fs[0] + ".txt")
        text_file = open(path_out, 'w')
        text_file.write(encoded)
        text_file.close()

我刚刚将它添加到我的代码中,它运行时没有返回任何错误,但是我的输出文件只与我的第一个pdf文件相关。是否有原因使它无法运行超过第一个文件?另外,如何在for循环的每次迭代期间更改输出以镜像pdf文件的文件名?这为我返回了以下错误:
dl=os.dirlist(“Users/Jack/Downloads/pyPdf-1.13”)AttributeError:'module'对象没有属性“dirlist”
对不起,listdir不是dirlist,我的错误,我更正了。注意,与公认的答案相比,这段代码也解决了目录搜索问题。这看起来会起作用!问题是我需要文件来引用我的目录。我会这样做吗
files=“Users/Jack/Downloads/pyPdf-1.13”
您可以使用glob从目录中获取文件,就像Rob的回答中那样,它提供了帮助,并且实际起到了作用(某种程度上)。我现在遇到一个问题,命名的文本文件正在返回,但它们是空的,当我尝试执行几百个文件时,我得到错误
pyPdf.utils.PdfReadError:EOF marker not found
。你知道为什么会发生这两种情况吗?我真的很感谢你的帮助!检查
content.encode
是否未返回
None
:我认为它可能会更改“就地”编码。例如,尝试添加
print encoded
,看看它是否符合您的期望。此答案没有涵盖OP问题的所有方面,即“在文件夹中的所有文件上”。