Python 字符串行为隐藏内置文件对象
Python string behaviour shadowing builtin file object
我在 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
您可能会说,我是这方面的新手,非常感谢任何指导!
差异必须在传递给 find_filename 的字符串中,并且两个版本之间是不同的。
对于你的第一个版本,目录中的斜杠都是正斜杠,包括文件名之前的斜杠:
C:/Users/jpettit/documents/projects/vendor 个文件 script/test files/122484.pdf
在 Windows 上,没有尾部斜线的 os.path.join 将在文件名前附加一个反斜线,导致:
"C:/Users/jpettit/documents/projects/vendor 文件 script/test files2484.pdf
如果您在目录名称末尾添加正斜杠,os.path.join 将产生与您的示例相同的结果。
错误消息说您正在 隐藏 file
内置函数 - 这就是此行的效果:
file = "122484.pdf"
从那时起,file
是一个字符串而不是内置函数。这个问题的一般建议是 "don't do that" - 即选择另一个名称(改为 filename
可能是一个不错的选择)。但是,在这种情况下,更好的建议是在此处使用 open
函数,因为 file
是它的弃用别名(已在 Python 3 中删除)。所以,当你这样做时:
fp = file(path, 'rb')
改为这样做:
fp = open(path, 'rb')
这种特殊的使用名称来隐藏内置函数是安全的并且可能不足为奇,但通常您应该小心。
您正在隐藏内置 file object
不要那样做。调用您的变量 f
、myfile
、thefile
或其他变量。
不要隐藏内置函数的名称。永远不要调用你的列表 list
,不要调用你的字符串 string
,不要调用你的字典 dict
,不要调用你的集合 set
,不要不要调用您的操作员 operator
...您可以调用您的函数 function
(在 Python 中),但您仍然不应该这样做。
...不要调用您的对象 object
,也不要调用您的类型 type
.
我在 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
您可能会说,我是这方面的新手,非常感谢任何指导!
差异必须在传递给 find_filename 的字符串中,并且两个版本之间是不同的。
对于你的第一个版本,目录中的斜杠都是正斜杠,包括文件名之前的斜杠:
C:/Users/jpettit/documents/projects/vendor 个文件 script/test files/122484.pdf
在 Windows 上,没有尾部斜线的 os.path.join 将在文件名前附加一个反斜线,导致:
"C:/Users/jpettit/documents/projects/vendor 文件 script/test files2484.pdf
如果您在目录名称末尾添加正斜杠,os.path.join 将产生与您的示例相同的结果。
错误消息说您正在 隐藏 file
内置函数 - 这就是此行的效果:
file = "122484.pdf"
从那时起,file
是一个字符串而不是内置函数。这个问题的一般建议是 "don't do that" - 即选择另一个名称(改为 filename
可能是一个不错的选择)。但是,在这种情况下,更好的建议是在此处使用 open
函数,因为 file
是它的弃用别名(已在 Python 3 中删除)。所以,当你这样做时:
fp = file(path, 'rb')
改为这样做:
fp = open(path, 'rb')
这种特殊的使用名称来隐藏内置函数是安全的并且可能不足为奇,但通常您应该小心。
您正在隐藏内置 file object
不要那样做。调用您的变量 f
、myfile
、thefile
或其他变量。
不要隐藏内置函数的名称。永远不要调用你的列表 list
,不要调用你的字符串 string
,不要调用你的字典 dict
,不要调用你的集合 set
,不要不要调用您的操作员 operator
...您可以调用您的函数 function
(在 Python 中),但您仍然不应该这样做。
...不要调用您的对象 object
,也不要调用您的类型 type
.