我想遍历目录中所有文件夹中的pdf文件,对这些文件进行操作(提取文本,保存为.txt),然后将所有txt保存到名称相同但位于不同目录中的另一组文件夹中。该功能按预期执行,但不与子文件夹一起执行。我知道这里有os.walk,但是对于如何在这里使用它感到不安。如果我的所有文件都没有子文件夹,则此功能有效;它写入所需的目录。但是我需要遍历这些文件夹,然后保存到其他目录中的那些文件夹中。
在一个目录中找到文件,对其进行操作,然后保存到另一个目录。尝试os.walk,但未成功合并文件夹结构。
文件夹结构基本上是path / folder1 ... folderN
具有30K +文件,因此要保留在文件夹系统中。
def convertall(pdfDir, txtDir):
if pdfDir == "": pdfDir = os.walk(path) + "\\"
for pdf in os.listdir(pdfDir): --- tried os.walk here too;
fileExtension = pdf.split(".")[-1]
if fileExtension == "pdf":
pdfFilename = pdfDir + pdf
text = convert(pdfFilename)
textFilename = txtDir + pdf + ".txt"
textFile = open(textFilename, "w")
textFile.write(text)
pdfDir = pdfpath
txtDir = txtpath
convertall(pdfDir)
计划针对各种操作执行此操作,因此希望了解一些常规解决方案。
答案 0 :(得分:0)
os.walk
调用的 topdown=True
以(this_directory_path, directories_in_this_directory, files_in_this_directory)
的格式在每次迭代中返回一个元组。元组的第二个和第三个元素是列表,这意味着您也必须遍历它们。因此,您可以像这样遍历目录结构:
import os
def create_my_new_path(old_root)
# This gives us everything after /home/user/PDFs, e.g. folderN
relative_path = os.path.relpath(old_root, "/home/user/PDFs")
# This returns "/home/user/TXTs/folderN"
return os.path.join("/home/user/TXTs", relative_path)
for root, directories, files in os.walk("/home/user/PDFs", topdown=True):
for pdf_filename in files:
# Use .lower() for the comparison in case there are files that end in ".PDF"
if pdf_filename[-4:].lower() == ".pdf":
# the variable `root` may not contain the absolute path
# depending on what you passed to os.walk, so you might
# want to use os.path.abspath(root) before passing it
# to the path builder
txt_save_dir = create_my_new_path(root)
txt_filename = "".join(old_filename[:-4], ".txt")
result = parse_PDF(os.path.join(root, filename))
with open(os.path.join(txt_save_dir, txt_filename), "w") as f:
f.write(result)
for directory in directories:
# If you wanted to do something with the subfolders too, you could do it here
continue
我希望这个示例足够容易理解,以便您可以根据需要进行调整。
一些提示:
os.path.join
来创建文件路径而不是串联,因为如果丢失,它将自动添加操作系统的适当分隔符。如果忘记确保文件夹和文件分开,则会将其写入错误的位置。 with open(path, mode) as myfile:
是打开文件的好方法,因为即使抛出异常,它也会在with
子句的结尾自动为您关闭文件。这就是官方python教程建议您立即打开文件的方式。 https://docs.python.org/3.7/tutorial/inputoutput.html#reading-and-writing-files 所有os.path
操作:https://docs.python.org/3/library/os.path.html
os.walk
的用法可以在这里找到:https://docs.python.org/3/library/os.html