1

我在 Windows 上用 Python 2.7 编写脚本时遇到了一些麻烦。在脚本的一部分中,我需要从一个目录和带有扩展名的文件名组成一个 windows 文件路径。当我将它作为字符串写入时它工作正常,但是当我尝试将它作为连接时出现错误。我认为这可能与路径中的空格有关。

这是一个有效的代码部分

filepath = os.path.normpath("C:/Users/jpettit/documents/projects/vendor files script/test files/122484.pdf")

print find_filename(filepath)

这是不起作用的代码部分

directory_path = os.path.normpath("C:/Users/jpettit/documents/projects/vendor files script/test files")

file = "122484.pdf"

filepath = os.path.join(directory_path, file)
print find_filename(filepath)

我很难看出这两者之间有什么区别。这是整个脚本上下文中的代码。

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from cStringIO import StringIO
import re
import os


def convert_pdf_to_txt(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = file(path, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos=set()
    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
        interpreter.process_page(page)
    fp.close()
    device.close()
    str = retstr.getvalue()
    retstr.close()
    return str

def find_filename(filepath):
    try:
        filenumberlocation = re.search('\d\d\d\d\d\d\.pdf',filepath, re.IGNORECASE)
        filenumber = filenumberlocation.group()[:6]
        print filepath
        pdfconverted = convert_pdf_to_txt(filepath)
        revlocation = re.search('REV #\n....',pdfconverted)
        rev = revlocation.group()[-4:]
        new_filename = filenumber + ' ' + rev + '.pdf'
        return new_filename
    except AttributeError:
        return os.path.basename(filepath)

def list_files(directory_path):
    filenames_list = []
    for dirpath, dirnames, filenames in os.walk(directory_path):
        filenames_list.extend(filenames)    
    return filenames_list

directory_path = os.path.normpath("C:/Users/jpettit/documents/projects/vendor files script/test files")

file_list = list_files(directory_path)

for file in file_list:
    filepath = os.path.join(directory_path, file)
    os.rename(filepath, os.path.join(directory_path, find_filename(file)))

我得到的错误如下

Traceback (most recent call last):
    File "revfind.txt", line 59, in <module>
        os.rename(filepath, os.path.join(directory_path, find_filename(file)))
    File "revfind.txt", line 34, in find_filename
        pdfconverted = convert_pdf_to_txt(filepath)
    File "revfind.txt", line 16, in convert_pdf_to_txt
        fp = file(path, 'rb')
TypeError: 'str' object is not callable

您可能会说,我对此很陌生,非常感谢任何指导!

4

3 回答 3

0

错误消息说您正在隐藏file内置 - 这就是这一行的效果:

file = "122484.pdf"

从那时起,它file是一个字符串而不是内置函数。对这个问题的一般建议是“不要那样做”——即,选择另一个名称(filename改为调用它可能是一个不错的选择)。但是,在这种情况下,更好的建议是在open此处使用该函数,因为file它是一个已弃用的别名(已在 Python 3 中删除)。所以,当你这样做时:

fp = file(path, 'rb')

改为这样做:

fp = open(path, 'rb')

这种特殊使用名称遮蔽内置函数的方法恰好是安全的,并且可能不足为奇,但一般情况下您应该小心。

于 2015-02-27T09:20:45.170 回答
0

您正在隐藏内置文件对象

不要那样做。调用您的变量f,myfilethefile其他任何内容。

不要隐藏内置函数的名称。永远不要调用你的 list list,不要调用你的 string string,不要调用你的 dict dict,不要调用你的 set set,不要调用你的操作符operator......你可以调用你的函数function(在 Python 中),但是你仍然不应该。...不要调用你的 object object,也不要调用你的 type type

于 2015-02-27T09:32:20.420 回答
-1

差异必须在传递给 find_filename 的字符串中,并且在两个版本之间是不同的。

使用您的第一个版本,目录中的斜杠都是正斜杠,包括文件名之前的斜杠:

C:/Users/jpettit/documents/projects/vendor files script/test files/122484.pdf

在 Windows 上,没有尾部斜杠的 os.path.join 将在文件名前附加一个反斜杠,从而导致:

"C:/Users/jpettit/documents/projects/vendor files script/test files\122484.pdf

如果您在目录名称的末尾添加一个正斜杠,则 os.path.join 将产生与您的示例相同的结果。

于 2015-02-27T09:11:43.280 回答