用Python打开现有文件时的IOError
运行以下代码:
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