用Python打开现有文件时的IOError

0 投票
3 回答
1345 浏览
提问于 2025-04-15 19:41

运行以下代码:

import os
import datetime
import ftplib

currdate = datetime.datetime.now()
formatdate = currdate.strftime("%m-%d-%Y %H%M")

def log():

    fqn = os.uname()[1]
    ext_ip = urllib2.urlopen('http://whatismyip.org').read()
    log = open ('/Users/admin/Documents/locatelog.txt','w')
    log.write(str("Asset: %s " % fqn))
    log.write(str("Checking in from IP#: %s" % ext_ip))
    smush = str(fqn +' @ ' + formatdate)
    os.rename('/Users/admin/Documents/locatelog.txt','/Users/admin/Documents/%s.txt' %  smush )

    s = ftplib.FTP('10.7.1.71','username','password')
    f = open('/Users/admin/Documents/%s.txt' % smush,'r')
    s.storbinary("STOR /Users/admin/Documents/%s.txt" % smush,f)

会出现以下错误:

ftplib.error_perm: 550 /Users/admin/Documents/678538.local @ 02-24-2010 1301.txt: No such file or directory

我觉得这一行有点问题:

s.storbinary("STOR /Users/admin/Documents/%s.txt" % smush,f)

678538是我正在测试的主机...我使用的是Mac OS X 10.5和Python 2.5.1

3 个回答

1

从文件名中去掉所有空格。例如,在 smush = str(fqn +' @ ' + formatdate) 这行代码中,你在 "@" 的前面和后面都加了空格。你的路径看起来像这样:

/Users/admin/Documents/something @ something

当你把这个路径传给 ftplib 时,可能会出现问题。另一种方法是试着加上引号,比如:

s.storbinary("STOR '/Users/admin/Documents/%s.txt'" % smush,f)
4

是不是应该写成f = open('/Users/admin/Documents/%s.txt' % smush,'r') 呢?注意前面有个/Users前面。

如果你不加第一个/,脚本就会认为这个文件的路径是相对于当前目录的,也就是脚本运行的地方。

编辑:

我对Python不是很熟悉(我希望我能更懂),但是不是应该写成:

s.storbinary('STOR /Users/admin/Documents/%s.txt' % smush,f) 呢?

在你的例子中,Python会把你的字符串当作字面意思来处理,而你想要的是用%s来插入smush的值。

编辑 2:

你的服务器上有这个目录/Users/admin/Documents/吗?如果没有的话,我觉得你得先创建这个目录才能复制任何东西。(因为错误信息是说有一些文件/文件夹缺失)。

你可以先自己创建这些目录。运行你的脚本。如果文件成功复制了,那你就可以在脚本里加上创建目录的代码。

0

编辑:

这个版本可以正常工作:问题是我写入的是缓冲区,而不是文件。

import os
import urllib2
import datetime
import ftplib

currdate = datetime.datetime.now()
formatdate = currdate.strftime("%m-%d-%Y-%H%M")

def log():

    fqn = os.uname()[1]
    ext_ip = urllib2.urlopen('http://whatismyip.org').read()
    smush = str(fqn + formatdate)
    s = ftplib.FTP('10.7.1.71','username','password')
    f = open('/Users/admin/Documents/%s.txt' % smush,'w')
    f.write(str("Asset: %s " % fqn))
    f.write('\n')
    f.write(str("Checking in from IP#: %s" % ext_ip))
    f.write('\n')
    f.write(str("On: %s" % formatdate))
    f.close
    f = open('/Users/admin/Documents/%s.txt' % smush,'rb')
    s.storbinary('STOR %s.txt' % smush , f)
    s.close
    f.close

撰写回答