python glob 或 listdir 创建然后将文件从一个目录保存到另一个目录
python glob or listdir to create then save files from one directory to another
我正在将文档从 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 行。
import os, glob
def convert_multiple(pdf_dir, txt_dir):
if pdf_dir == "": pdf_dir = os.getcwd() # If no pdf_dir passed in
for filepath in glob.iglob(f"{pdf_dir}/**/*.pdf", recursive=True):
text = convert(filepath)
root, _ = os.path.splitext(filepath) # Remove extension
txt_filepath = os.path.join(txt_dir, os.path.relpath(root, pdf_dir)) + ".txt"
txt_filepath = os.path.normpath(txt_filepath) # Not really necessary
print(txt_filepath)
# os.makedirs(os.path.dirname(txt_filepath), exist_ok=True)
# with open(txt_filepath, "wt") as f:
# f.write(text)
pdf_dir = r"C:/Users/Documents/pdf/"
txt_dir = r"C:/Users/Documents/txt/"
convert_multiple(pdf_dir, txt_dir)
要确定新 .txt
文件的文件路径,请使用 os.path
模块中的函数。
os.path.relpath(filepath, pdf_dir)
returns 文件的文件路径,包括相对于 pdf_dir
.
的任何子目录
假设filepath
是:
C:/Users/Documents/pdf/Setec Astronomy/employees.pdf
并且pdf_dir
是
C:/Users/Documents/pdf/
它将 return Setec Astronomy/employees.pdf
然后可以与 txt_dir
一起传递到 os.path.join()
,为我们提供包含额外子目录的完整文件路径。
你可以 txt_filepath = filepath.replace(filepath, pdf_dir)
,但你必须确保所有相应的斜线都在同一方向,并且没有 extra/missing leading/trailing 斜线。
在打开新的 .txt
文件之前,需要创建所有子目录。 os.path.dirname()
被调用以获取文件目录的文件路径,并且 os.makedirs()
将其 exist_ok
参数设置为 True
,以抑制 FileExistsError
异常,如果目录已经存在。
打开.txt
文件时使用with
语句避免显式调用.close()
,特别是在任何异常情况下。
我正在将文档从 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 行。
import os, glob
def convert_multiple(pdf_dir, txt_dir):
if pdf_dir == "": pdf_dir = os.getcwd() # If no pdf_dir passed in
for filepath in glob.iglob(f"{pdf_dir}/**/*.pdf", recursive=True):
text = convert(filepath)
root, _ = os.path.splitext(filepath) # Remove extension
txt_filepath = os.path.join(txt_dir, os.path.relpath(root, pdf_dir)) + ".txt"
txt_filepath = os.path.normpath(txt_filepath) # Not really necessary
print(txt_filepath)
# os.makedirs(os.path.dirname(txt_filepath), exist_ok=True)
# with open(txt_filepath, "wt") as f:
# f.write(text)
pdf_dir = r"C:/Users/Documents/pdf/"
txt_dir = r"C:/Users/Documents/txt/"
convert_multiple(pdf_dir, txt_dir)
要确定新 .txt
文件的文件路径,请使用 os.path
模块中的函数。
os.path.relpath(filepath, pdf_dir)
returns 文件的文件路径,包括相对于 pdf_dir
.
假设filepath
是:
C:/Users/Documents/pdf/Setec Astronomy/employees.pdf
并且pdf_dir
是
C:/Users/Documents/pdf/
它将 return Setec Astronomy/employees.pdf
然后可以与 txt_dir
一起传递到 os.path.join()
,为我们提供包含额外子目录的完整文件路径。
你可以 txt_filepath = filepath.replace(filepath, pdf_dir)
,但你必须确保所有相应的斜线都在同一方向,并且没有 extra/missing leading/trailing 斜线。
在打开新的 .txt
文件之前,需要创建所有子目录。 os.path.dirname()
被调用以获取文件目录的文件路径,并且 os.makedirs()
将其 exist_ok
参数设置为 True
,以抑制 FileExistsError
异常,如果目录已经存在。
打开.txt
文件时使用with
语句避免显式调用.close()
,特别是在任何异常情况下。