当前位置:首页 » 编程软件 » python脚本编写实例

python脚本编写实例

发布时间: 2022-12-25 00:42:47

python自动化脚本怎么编写

首先你需要在北鲲云超算上申请python这款软件,然后选择配置后就可以直接开始作业了,运行软件后就可以开始搭建脚本界面,编写脚本代码,用超算跑作业很方便,直接线上就可以使用,不需要下载到本地,而且计算效率非常的高。

❷ 如何在windows上编写python脚本

Python安装好以后,在开始菜单会看到一个idle工具(一个增强的交互命令行解释器窗口)以及一个自带的编辑器。
在任意目录新建一个.py文件或者保存的时候以.py结尾,用记事本、Python自带的编辑器或者其他编辑器如Sublime
Text或者NotePad++都行。
如果你使用的是idle,直接按F5就能在Python自带的命令行查看结果
如果是用记事本或者其他编辑器,快捷键win+R调出运行目录,输入cmd,然后在命令行里进入这个目录,输入python
[filename].py或者[filename].py就可以看到运行结果了

❸ 用python编写脚本程序,实现用户输入3个整数,放入列表,并输出最小值

list1 = input("请输入3个以空格为间隔的整数:").split()
"""以空格进行分割,删去字符串中的空格,剩下的元素以列表形式返回"""
print("最小值为:",min(list1)) #利用内置函数min()返回最小值

❹ 编写一个python脚本,完成以下功能: (1)调用一个python程序,执行该程序; (2)该程序启动一个shell;

这还真不知道。。。不过我看了下要求,如果只是从一个文本(也可以是任何文件,例如py)读出代码,再运行结果。那只需要读出文本内容,然后使用exec执行就好了

❺ 如何用python写一个脚本,来跑java代码上的cucumber集成测试

1.直接执行Python脚本代码
引用 org.python包
1 PythonInterpreter interpreter = new PythonInterpreter();
2 interpreter.exec("days=('mod','Tue','Wed','Thu','Fri','Sat','Sun'); "); ///执行python脚本


2. 执行python .py文件
1 PythonInterpreter interpreter = new PythonInterpreter();
2 InputStream filepy = new FileInputStream("D:\\demo.py");
3 interpreter.execfile(filepy); ///执行python py文件
4 filepy.close();


3. 使用Runtime.getRuntime()执行脚本文件
这种方式和.net下面调用cmd执行命令的方式类似。如果执行的python脚本有引用第三方包的,建议使用此种方式。使用上面两种方式会报错java ImportError: No mole named arcpy。
1 Process proc = Runtime.getRuntime().exec("python D:\\demo.py");
2 proc.waitFor();

❻ Python 如何写脚本

以Python2.7操作为例:

1、首先需要打开电脑桌面,按开始的快捷键,点击Python2.7如图所示的选项进入。

❼ 如何使用python编写测试脚本

1)doctest
使用doctest是一种类似于命令行尝试的方式,用法很简单,如下

复制代码代码如下:

def f(n):
"""
>>> f(1)
1
>>> f(2)
2
"""
print(n)

if __name__ == '__main__':
import doctest
doctest.testmod()

应该来说是足够简单了,另外还有一种方式doctest.testfile(filename),就是把命令行的方式放在文件里进行测试。

2)unittest
unittest历史悠久,最早可以追溯到上世纪七八十年代了,C++,Java里也都有类似的实现,Python里的实现很简单。
unittest在python里主要的实现方式是TestCase,TestSuite。用法还是例子起步。

复制代码代码如下:

from widget import Widget
import unittest
# 执行测试的类
class WidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget()
def tearDown(self):
self.widget.dispose()
self.widget = None
def testSize(self):
self.assertEqual(self.widget.getSize(), (40, 40))
def testResize(self):
self.widget.resize(100, 100)
self.assertEqual(self.widget.getSize(), (100, 100))
# 测试
if __name__ == "__main__":
# 构造测试集
suite = unittest.TestSuite()
suite.addTest(WidgetTestCase("testSize"))
suite.addTest(WidgetTestCase("testResize"))

# 执行测试
runner = unittest.TextTestRunner()
runner.run(suite)

简单的说,1>构造TestCase(测试用例),其中的setup和teardown负责预处理和善后工作。2>构造测试集,添加用例3>执行测试需要说明的是测试方法,在Python中有N多测试函数,主要的有:
TestCase.assert_(expr[, msg])
TestCase.failUnless(expr[, msg])
TestCase.assertTrue(expr[, msg])
TestCase.assertEqual(first, second[, msg])
TestCase.failUnlessEqual(first, second[, msg])
TestCase.assertNotEqual(first, second[, msg])
TestCase.failIfEqual(first, second[, msg])
TestCase.assertAlmostEqual(first, second[, places[, msg]])
TestCase.failUnlessAlmostEqual(first, second[, places[, msg]])
TestCase.assertNotAlmostEqual(first, second[, places[, msg]])
TestCase.failIfAlmostEqual(first, second[, places[, msg]])
TestCase.assertRaises(exception, callable, ...)
TestCase.failUnlessRaises(exception, callable, ...)
TestCase.failIf(expr[, msg])
TestCase.assertFalse(expr[, msg])
TestCase.fail([msg])

❽ 在wps中写python代码

python是一款应用非常广泛的脚本程序语言,谷歌公司的网页就是用python编写。python在生物信息、统计、网页制作、计算等多个领域都体现出了强大的功能。python和其他脚本语言如java、R、Perl 一样,都可以直接在命令行里运行脚本程序。工具/原料python;CMD命令行;windows操作系统方法/步骤1、首先下载安装python,建议安装2.7版本以上,3.0版本以下,由于3.0版本以上不向下兼容,体验较差。2、打开文本编辑器,推荐editplus,notepad等,将文件保存成 .py格式,editplus和notepad支持识别python语法。脚本第一行一定要写上 #!usr/bin/python表示该脚本文件是可执行python脚本如果python目录不在usr/bin目录下,则替换成当前python执行程序的目录。3、编写完脚本之后注意调试、可以直接用editplus调试。调试方法可自行网络。脚本写完之后,打开CMD命令行,前提是python 已经被加入到环境变量中,如果没有加入到环境变量,请网络4、在CMD命令行中,输入 “python” + “空格”,即 ”python “;将已经写好的脚本文件拖拽到当前光标位置,然后敲回车运行即可。

linux 下Python 脚本编写的"奇技淫巧"

“ 生命完美的答案,无非走过没有遗憾 ---《天蓝》”

“如何能够解析脚本运行命令行选项(位于 sys.argv 中)”

argparse 模块可被用来解析命令行选项

常用来定义一个脚本的说明文档,一般我们写python脚本会通过 if..else 的方式来提供一个脚本说明文档,python不支持switch。所以很麻烦,其实,我们可以通过 argparse 来编写说明文档。

我们来看看怎么执行一个python脚本

对于熟悉Linux的小伙伴下面的文档在熟悉不过了,这个一个标准Linxu软件包的说明文档,文档中定义是软件包的说明

来看看这个脚本是如何编写的

为了解析命令行选项, 首先要创建一个 ArgumentParser 实例, 使用 add_argument() 方法声明你想要支持的选项。在每个 add-argument() 调用中:

dest 参数指定解析结果被指派给属性的名字。 metavar 参数被用来生成帮助信息。

action 参数 指定跟属性对应的处理逻辑,通常的 值为 store , 被用来存储 某个值 或将 多个参数值收集到一个列表中 。

nargs 参数收集 所有剩余的命令行参数到一个列表中。在本例中它被用来构造一个文件名列表

action='store_true' 根据参数是否存在来设置一个位置 Boolean 标志:

action='store' 参数接受一个单独值并将其存储为一个字符串

如果一个都没有,会提示缺少参数 -p/--pat

choices={'slow', 'fast'}, 参数说明接受一个值,但是会将其和可能的选择值做比较,以检测其合法性:

一旦参数选项被指定,你就可以执行 parser.parse() 方法了。它会处理 sys.argv 的值并返回一个结果实例。每个参数值会被设置成该实例中 add_argument() 方法的 dest 参数指定的属性值。

还很多种其他方法解析命令行选项。可以会手动地处理 sys.argv 或者使用 getopt 模块 。但是,如果你采用本节的方式,将会减少很多冗余代码,底层细节 argparse 模块 已经帮你处理好了。你可能还会碰到使用 optparse 库解析选项的代码。尽管 optparse 和 argparse 很像 ,但是后者更先进,因此在新的程序中你应该使用它。

“你写了个脚本,运行时需要一个密码。此脚本是交互式的,因此不能将密码在脚本中硬编码,而是需要弹出一个密码输入提示,让用户自己输入。”

Python 的 getpass 模块 正是你所需要的。你可以让你很轻松地弹出密码输入提示,并且不会在用户终端显示密码。

代码中 getpass.getuser() 不会弹出用户名的输入提示。它会根据该 用户的 shell 环境 或者会依据 本地系统的密码库 (支持 pwd 模块的平台)来使用 当前用户的登录名

在bash中编写pytohn脚本接收外部数据的方式,一般情况下,对于一般变量,我们用命令行变量的方式比较多(手动的处理 sys.argv ),对于 文件内容或者bash命令输出 直接通过脚本内部获取需要的数据。

其实python 脚本也可以用其他方式来接收 传递给他的 文件数据或者bash命令输出 ,包括将 命令行的输出 通过 管道传递 给该脚本、 重定向文件到该脚本 ,或在 命令行中传递一个文件名 或 文件名列表 给该脚本。

这里通过 Python 内置的 fileinput 模块 ,可以实现重 定向,管道,以文佳输出 的方式传递数据到脚本内部

使用 fileinput.input() 方法可以获取当前输入脚本的数据,脚本里面用一个 FileInput 迭代器接收

文件直接接收

重定向接收

管道方式接收

fileinput.input() 创建并返回一个 FileInput 类的实例,该实例可以被当做一个 上下文管理器 使用。因此,整合起来,如果我们要写一个打印多个文件输出的脚本,那么我们需要在输出中包含文件名和行号

“你想执行一个外部命令并以 Python 字符串的形式获取执行结果。”

使用 subprocess.check_output() 函数。

执行下试试

如果被执行的命令以非零码返回,就会抛出异常。下面的例子捕获到错误并获取返回码:

默认情况下, check_output() 仅仅返回输入到标准输出的值。如果你需要 同时收集标准输出和错误输出 ,使用 stderr 参数:

如果你需要用一个超时机制来执行命令,使用 timeout 参数:

通常来讲,命令的执行 不需要 使用到 底层 shell 环境(比如 sh、bash) 。一个字符串行表会被传递给一个 低级系统命令 ,比如 os.execve() 。

如果你想让 命令被一个shell 执行 ,传递一个字符串参数,并设置参数 shell=True . 有时候你想要 Python 去执行一个复杂的 shell 命令 的时候这个就很有用了,比如管道流、I/O 重定向和其他特性。例如:

是在 shell 中执行命令会存在一定的安全风险,特别是当参数来自于用户输入时。这时候可以使用 shlex.quote() 函数 来将参数正确的用双引用引起来。

使用 check_output() 函数 是执行 外部命令 并获取其 返回值 的最简单方式。但是,如果你需要对 子进程做更复杂的交互 ,比如给它发送输入,你得采用另外一种方法。这时候可直接使用 subprocess.Popen 类。

关于子进程,简单来看下

也可以进程列表同协程结合的方式。你既可以在子shell中 进行繁重的处理工作,同时也不会让子shell的I/O受制于终端。

如果直接丢到后台会自动在终端输出IO

subprocess 模块对于依赖 TTY 的外部命令不合适用 。例如,你不能使用它来自动化一个用户输入密码的任务(比如一个 ssh 会话)。这时候,你需要使用到第三方模块了,比如基于着名的 expect 家族的工具(pexpect 或类似的)(pexpect可以理解为Linux下的expect的Python封装、通过pexpect可以实现对ssh、ftp、passwd、telnet等命令行进行自动交互,而无需人工干涉来达到自动化的目的。比如我们可以模拟一个FTP登录时所有交互,包括输入主机地址、用户名、密码、上传文件等,待出现异常还可以进行尝试自动处理。)

“你想向标准错误打印一条消息并返回某个非零状态码来终止程序运行”

通过 python 的 raise SystemExit(3) 命令可以主动抛出一个错误,通过 sys.stderr.write 将命令写到标准的输出端

直接将消息作为参数传给 SystemExit() ,那么你可以省略其他步骤

抛出一个 SystemExit 异常,使用错误消息作为参数,它会将消息在 sys.stderr 中打印,然后程序以状态码 1 退出

“你需要知道当前终端的大小以便正确的格式化输出。”

使用 os.get terminal size() 函数 来做到这一点。

“复制或移动文件和目录,但是又不想调用 shell 命令。”

shutil 模块 有很多便捷的函数可以复制文件和目录。使用起来非常简单

这里不多讲,熟悉Linux的小伙伴应该不陌生。

默认情况下,对于 符号链接 这些命令处理的是它指向的东西文件。例如,如果 源文件 是一个 符号链接 ,那么目标文件将会是 符号链接 指向的文件。如果你只想 复制符号链接本身 ,那么需要指定 关键字 参数 follow_symlinks

tree() 可以让你在复制过程中选择性的忽略某些文件或目录。你可以提供一个忽略函数,接受一个目录名和文件名列表作为输入,返回一个忽略的名称列表。例如:

对于文件元数据信息, 2() 这样的函数只能尽自己最大能力来保留它。 访问时间、创建时间和权限 这些基本信息会被保留,但是 对于所有者、ACLs、资源 fork 和其他更深层次的文件元信息就说不准了

通常不会去使用 shutil.tree() 函数 来执行 系统备份 。当处理文件名的时候,最好使用 os.path 中的函数来确保最大的可移植性

使用 tree() 复制文件夹的一个棘手的问题是对于错误的处理,可以使用异常块处理,或者通过 参数 ignore dangling symlinks=True 忽略掉无效符号链接。

“创建或解压常见格式的归档文件(比如.tar, .tgz 或.zip)”

shutil 模块拥有两个函数—— make archive() 和 unpack archive() 可派上用场,

make archive() 的第二个参数是期望的输出格式。可以使用 get archive formats() 获取所有支持的归档格式列表。

“你需要写一个涉及到文件查找操作的脚本,比如对日志归档文件的重命名工具,你不想在 Python 脚本中调用 shell,或者你要实现一些 shell 不能做的功能。”

查找文件,可使用 os.walk() 函数 ,传一个顶级目录名给它

os.walk() 方法 为我们 遍历目录树 ,每次进入一个目录,它会返回一个 三元组 ,包含 相对于查找目录的相对路径,一个该目录下的目录名列表,以及那个目录下面的文件名列表。

对于每个元组,只需检测一下目标文件名是否在文件列表中。如果是就使用 os.path.join() 合并路径。为了避免奇怪的路径名比如 ././foo//bar ,使用了另外两个函数来修正结果

os.walk(start) 还有跨平台的优势。并且,还能很轻松的加入其他的功能。我们再演示一个例子,下面的函数打印所有最近被修改过的文件:

打印10分钟之前被修改的数据

“怎样读取普通.ini 格式的配置文件?”

configparser 模块 能被用来读取配置文件

编写配置文件

如果有需要,你还能修改配置并使用 cfg.write() 方法将其写回到文件中

“你希望在脚本和程序中将诊断信息写入日志文件。”

python 脚本打印日志最简单方式是使用 logging 模块

五个日志调用( critical(), error(), warning(), info(), debug() )以降序方式表示不同的严重级别。 basicConfig() 的 level 参数是一个 过滤器 。所有级别低于此级别的日志消息都会被忽略掉。每个 logging 操作的参数是一个消息字符串,后面再跟一个或多个参数。构造最终的日志消息的时候我们使用了 % 操作符来格式化消息字符串。

如果你想使用配置文件,可以像下面这样修改 basicConfig() 调用:

logconfig.ini

在调用日志操作前先执行下 basicConfig() 函数方法 ,可以找标准输出或者文件中输出

basicConfig() 在程序中只能被执行一次。如果你稍后想改变日志配置,就需要先获取 root logger ,然后直接修改它。

更多见日志模块文档https://docs.python.org/3/howto/logging-cookbook.html

“你想给某个函数库增加日志功能,但是又不能影响到那些不使用日志功能的程序。”

对于想要执行日志操作的函数库,你应该创建一个专属的 logger 对象,并且像下面这样初始化配置:

使用这个配置,默认情况下不会打印日志,只有配置过日志系统,那么日志消息打印就开始生效

通常来讲,不应该在函数库代码中 自己配置日志系统 ,或者是已经有个已经存在的日志配置了。调用 getLogger( name ) 创建一个和调用模块同名的 logger 模块 。由于 模块 都是唯一的,因此创建的 logger 也将是唯一 的。所以当前进程中只有一个logging会生效。

log.addHandler(logging.NullHandler()) 操作将一个 空处理器 绑定到刚刚已经创建好的 logger 对象 上。一个空处理器默认会忽略调用所有的日志消息。因此,如果使用该函数库的时候还没有配置日志,那么将不会有消息或警告出现。

在这里,根日志被配置成仅仅 输出 ERROR 或更高级别的消息 。不过, somelib 的日志级别被单独配置成可以输出 debug 级别的消息, 它的优先级比全局配置高。像这样更改单独模块的日志配置对于调试来讲是很方便的,因为你无需去更改任何的全局日志配置——只需要修改你想要更多输出的模块的日志等级。(这个还有待研究)

“你想记录程序执行多个任务所花费的时间”

time 模块 包含很多函数来执行跟时间有关的函数。尽管如此,通常我们会在此基础之上构造一个更高级的接口来模拟一个计时器。

这个类定义了一个可以被用户根据需要启动、停止和重置的计时器。它会在elapsed 属性中记录整个消耗时间。下面是一个例子来演示怎样使用它:

这里通过 __enter__,__exit__ ,使用 with 语句 以及上下文管理器协议可以省略计时器打开和关闭操作。(关于上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明 __enter__和__exit__方法, , __enter__ 在出现with语句被调用, __exit__ 在代码执行完毕被调用,可以参考open()方法)

在计时中要考虑一个 底层的时间函数问题 。 一般来说, 使用 time.time() 或 time.clock() 计算的时间精度因操作系统的不同会有所不同。而使用 time.perf_counter() 函数可以确保使用系统上面 最精确的计时器 。

“你想对在 Unix 系统上面运行的程序设置内存或 CPU 的使用限制。”

resource 模块 能同时执行这两个任务。例如,要限制 CPU 时间,下面的代码在windows平台执行不了,但是Linux是可以的。

程序运行时, SIGXCPU 信号 在时间过期时被生成,然后执行清理并退出。

这暂时没有好的Demo...

程序运行到没有多余内存时会抛出 MemoryError 异常。

setrlimit() 函数 被用来设置特定资源上面的 软限制和硬限制 。

setrlimit() 函数 还能被用来设置 子进程数量、打开文件数以及类似系统资源的限制(cgroup) 。

“通过脚本启动浏览器并打开指定的 URL 网页”

webbrowser 模块 能被用来启动一个浏览器,并且与平台无关

新窗口打卡网站

当前窗口打开一个tab页

指定浏览器类型,可以使用 webbrowser.get() 函数

❿ 用python写测试脚本,从本地传文件至ftp远程路径

转自:http://news.tuxi.com.cn/kf/article/jhtdj.htm

本文实例讲述了python实现支持目录FTP上传下载文件的方法。分享给大家供大家参考。具体如下:

该程序支持ftp上传下载文件和目录、适用于windows和linux平台。

#!/usr/bin/envpython
#-*-coding:utf-8-*-
importftplib
importos
importsys
classFTPSync(object):
conn=ftplib.FTP()
def__init__(self,host,port=21):
self.conn.connect(host,port)
deflogin(self,username,password):
self.conn.login(username,password)
self.conn.set_pasv(False)
printself.conn.welcome
deftest(self,ftp_path):
printftp_path
printself._is_ftp_dir(ftp_path)
#printself.conn.nlst(ftp_path)
#self.conn.retrlines('LIST./a/b')
#ftp_parent_path=os.path.dirname(ftp_path)
#ftp_dir_name=os.path.basename(ftp_path)
#printftp_parent_path
#printftp_dir_name
def_is_ftp_file(self,ftp_path):
try:
ifftp_pathinself.conn.nlst(os.path.dirname(ftp_path)):
returnTrue
else:
returnFalse
exceptftplib.error_perm,e:
returnFalse
def_ftp_list(self,line):
list=line.split('')
ifself.ftp_dir_name==list[-1]andlist[0].startswith('d'):
self._is_dir=True
def_is_ftp_dir(self,ftp_path):
ftp_path=ftp_path.rstrip('/')
ftp_parent_path=os.path.dirname(ftp_path)
self.ftp_dir_name=os.path.basename(ftp_path)
self._is_dir=False
ifftp_path=='.'orftp_path=='./'orftp_path=='':
self._is_dir=True
else:
#thisuescallbackfunction,thatwillchange_is_dirvalue
try:
self.conn.retrlines('LIST%s'%ftp_parent_path,self._ftp_list)
exceptftplib.error_perm,e:
returnself._is_dir
returnself._is_dir
defget_file(self,ftp_path,local_path='.'):
ftp_path=ftp_path.rstrip('/')
ifself._is_ftp_file(ftp_path):
file_name=os.path.basename(ftp_path)
#如果本地路径是目录,下载文件到该目录
ifos.path.isdir(local_path):
file_handler=open(os.path.join(local_path,file_name),'wb')
self.conn.retrbinary("RETR%s"%(ftp_path),file_handler.write)
file_handler.close()
#如果本地路径不是目录,但上层目录存在,则按照本地路径的文件名作为下载的文件名称
elifos.path.isdir(os.path.dirname(local_path)):
file_handler=open(local_path,'wb')
self.conn.retrbinary("RETR%s"%(ftp_path),file_handler.write)
file_handler.close()
#如果本地路径不是目录,且上层目录不存在,则退出
else:
print'EROOR:Thedir:%sisnotexist'%os.path.dirname(local_path)
else:
print'EROOR:Theftpfile:%sisnotexist'%ftp_path
defput_file(self,local_path,ftp_path='.'):
ftp_path=ftp_path.rstrip('/')
ifos.path.isfile(local_path):
file_handler=open(local_path,"r")
local_file_name=os.path.basename(local_path)
#如果远程路径是个目录,则上传文件到这个目录,文件名不变
ifself._is_ftp_dir(ftp_path):
self.conn.storbinary('STOR%s'%os.path.join(ftp_path,local_file_name),file_handler)
#如果远程路径的上层是个目录,则上传文件,文件名按照给定命名
elifself._is_ftp_dir(os.path.dirname(ftp_path)):
print'STOR%s'%ftp_path
self.conn.storbinary('STOR%s'%ftp_path,file_handler)
#如果远程路径不是目录,且上一层的目录也不存在,则提示给定远程路径错误
else:
print'EROOR:Theftppath:%siserror'%ftp_path
file_handler.close()
else:
print'ERROR:Thefile:%sisnotexist'%local_path
defget_dir(self,ftp_path,local_path='.',begin=True):
ftp_path=ftp_path.rstrip('/')
#当ftp目录存在时下载
ifself._is_ftp_dir(ftp_path):
#如果下载到本地当前目录下,并创建目录
#下载初始化:如果给定的本地路径不存在需要创建,同时将ftp的目录存放在给定的本地目录下。
#ftp目录下文件存放的路径为local_path=local_path+os.path.basename(ftp_path)
#例如:将ftp文件夹a下载到本地的a/b目录下,则ftp的a目录下的文件将下载到本地的a/b/a目录下
ifbegin:
ifnotos.path.isdir(local_path):
os.makedirs(local_path)
local_path=os.path.join(local_path,os.path.basename(ftp_path))
#如果本地目录不存在,则创建目录
ifnotos.path.isdir(local_path):
os.makedirs(local_path)
#进入ftp目录,开始递归查询
self.conn.cwd(ftp_path)
ftp_files=self.conn.nlst()
forfileinftp_files:
local_file=os.path.join(local_path,file)
#如果fileftp路径是目录则递归上传目录(不需要再进行初始化begin的标志修改为False)
#如果fileftp路径是文件则直接上传文件
ifself._is_ftp_dir(file):
self.get_dir(file,local_file,False)
else:
self.get_file(file,local_file)
#如果当前ftp目录文件已经遍历完毕返回上一层目录
self.conn.cwd("..")
return
else:
print'ERROR:Thedir:%sisnotexist'%ftp_path
return

defput_dir(self,local_path,ftp_path='.',begin=True):
ftp_path=ftp_path.rstrip('/')
#当本地目录存在时上传
ifos.path.isdir(local_path):
#上传初始化:如果给定的ftp路径不存在需要创建,同时将本地的目录存放在给定的ftp目录下。
#本地目录下文件存放的路径为ftp_path=ftp_path+os.path.basename(local_path)
#例如:将本地文件夹a上传到ftp的a/b目录下,则本地a目录下的文件将上传的ftp的a/b/a目录下
ifbegin:
ifnotself._is_ftp_dir(ftp_path):
self.conn.mkd(ftp_path)
ftp_path=os.path.join(ftp_path,os.path.basename(local_path))
#如果ftp路径不是目录,则创建目录
ifnotself._is_ftp_dir(ftp_path):
self.conn.mkd(ftp_path)

#进入本地目录,开始递归查询
os.chdir(local_path)
local_files=os.listdir('.')
forfileinlocal_files:
#如果file本地路径是目录则递归上传目录(不需要再进行初始化begin的标志修改为False)
#如果file本地路径是文件则直接上传文件
ifos.path.isdir(file):
ftp_path=os.path.join(ftp_path,file)
self.put_dir(file,ftp_path,False)
else:
self.put_file(file,ftp_path)
#如果当前本地目录文件已经遍历完毕返回上一层目录
os.chdir("..")
else:
print'ERROR:Thedir:%sisnotexist'%local_path
return
if__name__=='__main__':
ftp=FTPSync('192.168.1.110')
ftp.login('test','test')
#上传文件,不重命名
#ftp.put_file('111.txt','a/b')
#上传文件,重命名
#ftp.put_file('111.txt','a/112.txt')
#下载文件,不重命名
#ftp.get_file('/a/111.txt',r'D:\')
#下载文件,重命名
#ftp.get_file('/a/111.txt',r'D:112.txt')
#下载到已经存在的文件夹
#ftp.get_dir('a/b/c',r'D:\a')
#下载到不存在的文件夹
#ftp.get_dir('a/b/c',r'D:\aa')
#上传到已经存在的文件夹
ftp.put_dir('b','a')
#上传到不存在的文件夹
ftp.put_dir('b','aa/B/')

希望本文所述对大家的Python程序设计有所帮助。

以下转自:http://blog.csdn.net/linda1000/article/details/8255771

Python中的ftplib模块

Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件

FTP的工作流程及基本操作可参考协议RFC959

ftp登陆连接

from ftplib import FTP #加载ftp模块

ftp=FTP() #设置变量
ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
ftp.connect("IP","port") #连接的ftp sever和端口
ftp.login("user","password")#连接的用户名,密码
print ftp.getwelcome() #打印出欢迎信息
ftp.cmd("xxx/xxx") #更改远程目录
bufsize=1024 #设置的缓冲区大小
filename="filename.txt" #需要下载的文件
file_handle=open(filename,"wb").write #以写模式在本地打开文件
ftp.retrbinaly("RETR filename.txt",file_handle,bufsize) #接收服务器上文件并写入本地文件
ftp.set_debuglevel(0) #关闭调试模式
ftp.quit #退出ftp

ftp相关命令操作

ftp.cwd(pathname) #设置FTP当前操作的路径
ftp.dir() #显示目录下文件信息
ftp.nlst() #获取目录下的文件
ftp.mkd(pathname) #新建远程目录
ftp.pwd() #返回当前所在位置
ftp.rmd(dirname) #删除远程目录
ftp.delete(filename) #删除远程文件
ftp.rename(fromname, toname)#将fromname修改名称为toname。
ftp.storbinaly("STOR filename.txt",file_handel,bufsize) #上传目标文件
ftp.retrbinary("RETR filename.txt",file_handel,bufsize)#下载FTP文件

网上找到一个具体的例子:

#例:FTP编程
fromftplibimportFTP

ftp=FTP()
timeout=30
port=21
ftp.connect('192.168.1.188',port,timeout)#连接FTP服务器
ftp.login('UserName','888888')#登录
printftp.getwelcome()#获得欢迎信息
ftp.cwd('file/test')#设置FTP路径
list=ftp.nlst()#获得目录列表
fornameinlist:
print(name)#打印文件名字
path='d:/data/'+name#文件保存路径
f=open(path,'wb')#打开要保存文件
filename='RETR'+name#保存FTP文件
ftp.retrbinary(filename,f.write)#保存FTP上的文件
ftp.delete(name)#删除FTP文件
ftp.storbinary('STOR'+filename,open(path,'rb'))#上传FTP文件
ftp.quit()#退出FTP服务器

完整的模板:

#!/usr/bin/python
#-*-coding:utf-8-*-
importftplib
importos
importsocket

HOST='ftp.mozilla.org'
DIRN='pub/mozilla.org/webtools'
FILE='bugzilla-3.6.7.tar.gz'
defmain():
try:
f=ftplib.FTP(HOST)
except(socket.error,socket.gaierror):
print'ERROR:cannotreach"%s"'%HOST
return
print'***Connectedtohost"%s"'%HOST

try:
f.login()
exceptftplib.error_perm:
print'ERROR:cannotloginanonymously'
f.quit()
return
print'***Loggedinas"anonymously"'
try:
f.cwd(DIRN)
exceptftplib.error_perm:
print'ERRORLcannotCDto"%s"'%DIRN
f.quit()
return
print'***Changedto"%s"folder'%DIRN
try:
#传一个回调函数给retrbinary()它在每接收一个二进制数据时都会被调用
f.retrbinary('RETR%s'%FILE,open(FILE,'wb').write)
exceptftplib.error_perm:
print'ERROR:cannotreadfile"%s"'%FILE
os.unlink(FILE)
else:
print'***Downloaded"%s"toCWD'%FILE
f.quit()
return

if__name__=='__main__':
main()
热点内容
ftp命令批量下载文件 发布:2025-07-18 11:58:45 浏览:743
nba2k17文件夹 发布:2025-07-18 11:48:53 浏览:870
朔源码是什么 发布:2025-07-18 11:44:33 浏览:774
迷你世界解压剧场 发布:2025-07-18 11:43:48 浏览:153
linux安装opencv 发布:2025-07-18 11:42:10 浏览:446
编程游戏的软件有哪些 发布:2025-07-18 11:41:34 浏览:956
c程序设计语言电子书 发布:2025-07-18 11:35:58 浏览:642
lightning耳机如何在安卓手机上用 发布:2025-07-18 11:21:47 浏览:176
妄想山海新宿怎么配置好 发布:2025-07-18 11:07:43 浏览:616
androidsaxxml解析xml 发布:2025-07-18 10:57:58 浏览:387