【问题标题】:Receiving Case Sensitive error's when Reading file using Python使用 Python 读取文件时接收大小写敏感错误
【发布时间】:2013-11-15 23:17:31
【问题描述】:
def getcrc(lookfor,path):
    abspath = basepath+path
    for root, dirs, files in os.walk(abspath):
        if lookfor in files:
            #print "Found: %s" % join(root, lookfor)         
            filename = join(root,lookfor)
            m = hashlib.md5()
        for line in open(filename,'rb'):
            m.update(line)
            print "File",filename,"CRC is ",m.hexdigest()
            return m.hexdigest()

我已经制作了上面的脚本来获取文件的 crc,当文件名完全匹配时它工作正常但是当违反区分大小写时我无法打开该文件,文件名是正确的但我想要使此代码不区分大小写。

以下是我收到的错误:

Traceback (most recent call last):
  File "C:\Users\darshanb\temp\de.ecw.python.QCsnapshot\src\XmlReaderTesting.py", line 80, in <module>
    s3 = getcrc(filename,path)
  File "C:\Users\darshanb\temp\de.ecw.python.QCsnapshot\src\Testing.py", line 51, in getcrc
    for line in open(filename,'rb'):
UnboundLocalError: local variable 'filename' referenced before assignment

例如我在 XML 中有一个文件名为“Appointments_ecw_resource.xsl”,我想为其查找 CRC,但在实际服务器中,名称较低的“appointments_ecw_resource.xsl”有时是大写, 有没有办法可以忽略区分大小写检查。

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    看起来您的 filename 变量是在前面的 if 语句的内部范围内定义的。在此范围之外对其进行初始化,或将 for 循环移至内部(取决于目的)。

    【讨论】:

    • 这是正确答案。他的for 循环在一个空列表上,这意味着循环体从未执行过,变量尚未初始化。
    【解决方案2】:

    您可以使用any() 和生成器表达式不区分大小写地匹配文件:

    lookfor = lookfor.lower()
    if any(lookfor == fname.lower() for fname in files):
    

    但是,您仍然需要将 for 循环缩进到 if 语句中,因为如果您查找的文件名不在那里,您仍然不需要读取该文件:

    lookfor = lookfor.lower()
    if any(lookfor == fname.lower() for fname in files):
        #print "Found: %s" % join(root, lookfor)         
        filename = join(root,lookfor)
        m = hashlib.md5()
        for line in open(filename,'rb'):
            m.update(line)
        print "File",filename,"CRC is ",m.hexdigest()
        return m.hexdigest()
    

    【讨论】:

    • 我相信 fname.lower 应该是 fname.lower()。另外,为lookfor.lower() 使用一个临时变量,而不是为files 中的每个文件都降级一次不是更好吗?
    • @dstromberg:哎呀,更正了。是的,临时的会更好。
    猜你喜欢
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多