-3

我有以下 Python 2.7 脚本。

该脚本遍历包含文件名的 CSV 文件,然后在 FTP 服务器上查找文件名。

但是,当在 ftp 上找不到该文件时出现错误:

赋值前引用的错误局部变量“newfile”

理想情况下,如果在 ftp 上找不到前一个文件,我希望脚本只移动到文件中的下一行。我该怎么做?提前致谢。

def googleclouda(googlefile): 



    import time
    import pysftp 
    import sys
    import os
    from os import path
    from datetime import datetime
    import calendar
    import zipfile
    import re

    os.chdir("C:\Users\\xxx\python\\xxx\\")  

    oftp = pysftp.Connection(host="xxxxxx", username="xxxxxx", password="xxxxxx")
    d = datetime.utcnow()
    unixtime=calendar.timegm(d.utctimetuple())
    month = datetime.now().strftime("%m") 
    string = googlefile+month+".*\.txt$"  

    possibleFiles = oftp.listdir("/") 
    for filename in possibleFiles:
            filedate = re.search(string, filename)  
            if filedate:
                newfile = filename

    timestamp  = oftp.stat(newfile).st_atime 
    if timestamp  > unixtime - 604800:  
        newtime=unixtime + 3600 
        gaamfile='file_123_26807_' 
        zipname = gaamfile+str(newtime)+'.sync.zip' 
        create_zip = zipfile.ZipFile(zipname, 'w', zipfile.ZIP_DEFLATED) 
        oftp.get(newfile, newfile)
        oftp.close()
        newfilename = gaamfile+str(newtime)+'.sync' 
        os.rename(newfile, newfilename)
        create_zip.write(newfilename)  
        create_zip.close()
        print newfile
    else: 
        print "No files found"


filecsv = 'filelist.csv' 

with open(filecsv, 'r') as f:
    for line in f:
        if not line.startswith('\n'): 
            googlefile = line.strip() 
            googleclouda(googlefile)
4

3 回答 3

0

尝试改变这个:

            if filedate:
                newfile = filename

进入这个:

            if filedate and filename is not none:
                newfile = filename
于 2018-02-15T09:26:22.473 回答
0

您的问题在于这段代码:

for filename in possibleFiles:
        filedate = re.search(string, filename)  
        if filedate:
            newfile = filename

newfile只有被定义if filedate。任何一个:

  • 检查您的输入,以便if filedate返回True
  • 将所有后续代码放在if子句下(通过额外的缩进),以便它只被执行if filedate == True
于 2018-02-15T09:21:22.617 回答
0

问题出在这一行:

timestamp  = oftp.stat(newfile).st_atime

如果newfile之前未根据 if 条件分配 if,即使未分配,您也会引用它。

在脚本的开头,正如@cco 所建议的那样,您还可以设置newfile为空字符串: newfile = ''

newfile您应该进行结构化,以便仅在分配时才处理其余部分。您可以在 上添加条件newfile


另外,如果我没记错的话,以下几行应该是 for 循环的一部分。否则newfile将仅包含找到的最后一个文件名。每次找到下一个时都会覆盖它。

timestamp  = oftp.stat(newfile).st_atime 
        if timestamp  > unixtime - 604800:  
            newtime=unixtime + 3600 
            gaamfile='file_123_26807_' 
            zipname = gaamfile+str(newtime)+'.sync.zip' 
            create_zip = zipfile.ZipFile(zipname, 'w', zipfile.ZIP_DEFLATED) 
            oftp.get(newfile, newfile)
            oftp.close()
            newfilename = gaamfile+str(newtime)+'.sync' 
            os.rename(newfile, newfilename)
            create_zip.write(newfilename)  
            create_zip.close()
            print newfile
        else: 
            print "No files found"
于 2018-02-15T09:32:11.880 回答