Python与命令行参数
目录
一、如何用命令行运行程序
1、具体做法
2、命令行参数
3、命令行的当前目录
二、文本处理实例
1、代码1.0
2、演示部分
3、代码2.0
4、演示部分
在前面的学习中,我们都是在PyCharm中运行的,但是如果我们有一个用Python写的实用工具,使用的次数很频繁,那么如果每次使用都要打开PyCharm,再把工具文件调到PyCharm中,再运行,显然不方便,所以我们有时需要用命令行的方式(命令脚本方式)来运行Python程序
一、如何用命令行运行程序
1、具体做法
我们首先需要打开命令行窗口(在Mac中叫终端):
在Windows中,我们按下Win + R键,(Win就是长得像窗户的那个按键)当我们按下之后,桌面的左下角就会弹出运行窗口,我们在里面输入“cmd”:
按下确定键,就会弹出命令行窗口:
(在Mac中是从launchPad里面启动终端)
现在我们已经可以在命令行窗口运行Python文件了:
只需要在里面写入“python XXX.py”,就可以运行XXX.py
我们先写一个简单的Python程序,像这样:
然后我们到命令行窗口去执行这个文件:
但是要注意一点,执行Python文件的时候需要在程序文件的当前目录下,否则命令行窗口就会返回找不到相关的文件:
我们只需要在命令行窗口中使用“cd” + 当前目录即可:
2、命令行参数
加入我们编写了一个程序,功能是把文件1的单词数量统计存放到结果到文件2,那么我们希望在命令行窗口中这样:
但是如何让窗口知道我们后面输入的两个文件是干啥的呢?
后面的a1.txt和a2.txt都是命令行参数,既然是参数,那么我们的程序文件内部需要有能获取到这些参数的方法或函数:
import sys
for i in sys.argv :
print(i)
这时候我们需要调用sys包,以及sys.argv列表
sys.argv是一个列表,它里面包含的元素均为字符串,每一个元素就是一个命令行参数,就拿我们上面那个例子,其中:
sys.argv[0]是hello.py
sys.argv[1]是a1.txt
sys.argv[2]是a2.txt
3、命令行的当前目录
在命令行窗口中,最前面的目录就是命令提示符表示的文件夹,而不是执行文件的当前目录,如果要执行某程序文件,需要用cd命令去转换目录
二、文本处理实例
那么我们现在就用上面所学的内容来制作一个实用工具!
1、代码1.0
我们要制作一个Python程序,要求把目标文件的各个单词的出现次数进行输出,并且在把这个结果返回到一个结果文件中:
那么我们就需要一个目标文件,里面包含众多单词,还需要一个结果文件,来装我们程序的输出结果:
import re
import sys
def ScyFile(mubiao, jieguo):
try:
a = open(mubiao, "r", encoding="utf-8") #打开目标文件
except Exception as e:
print(e) #如果文件不存在,则会执行此语句,避免因为出错导致
return 0
txt = a.read() #把目标文件读入到字符串txt中,这样里面就是一个包含整个txt文件的字符串
a.close()
fengefujihe = set() #把目标文件中的所有非字母符号放到集合中,集合起到一个不重复的作用
for i in txt:
if not (i >= "a" and i <= "z" or i >= "A" and i <= "Z"):
fengefujihe.add(i)
# 使用 re.escape 自动转义特殊字符
Fengefu = "|".join(re.escape(j) for j in fengefujihe) #re.escape(j)是把每一个j元素中的字符变成能直接转译的字符,而a.join(b)就是把可迭代对象b用字符串a来分割,并组成一个新的字符
lst = re.split(Fengefu, txt) #用Fengefu来分割txt
for k in lst:
if k == "": #有可能出现两个分隔符挨着,然后就会划分出一个空串,如果是空串就不要
continue
danci = k.lower() #不是空串就把字符全部转为小写
if danci in jieguo:
jieguo[danci] += 1 #如果单词之前已经存在,就+1
else:
jieguo[danci] = 1 #不存在就设置为1
return 1
result = {} #用字典的键值对来存储单词和其出现的次数
if ScyFile(sys.argv[1], result) == 0: #如果函数返回了0,就直接结束程序
exit()
lst = list(result.items()) #返回一个列表,列表里面有若干元组,每个元组都是一个键值对
lst.sort() #按字典分类
b = open(sys.argv[2], "w") #对结果文件进行写入操作
for l in lst:
b.write("%s\t%d\n" % (l[0], l[1])) #规定写入格式
b.close()
(注意这个代码在PyCharm是无法运行的,因为没有给参数值)
2、演示部分
我们先在桌面上新建好这三个文件,其中111.py是存放我们的代码的,mubiao.txt中包含一小段文章,jieguo.txt是用来存储结果用的:
mubiao.txt中的内容:
我们现在在桌面上右键,然后点击“在终端中打开”,按照顺序输入文件:
然后我们回到jieguo.txt,发现原本空空的文本文档,里面存放了我们想要的结果:
3、代码2.0
有了上面的基础代码,我们现在可以给这个代码做一些升级,上面的1.0版本只能针对于一个文件进行字频的输出如果我们像针对多个文件该如何做?:
比如,我们想要统计所有a打头的txt文件中的文字的字频,我们只需润色一下上面的代码即可:
import os
import re
import sys
def ScyFilePro(mubiao, jieguo):
try:
a = open(mubiao, "r", encoding="utf-8") #打开目标文件
except Exception as e:
print(e) #如果文件不存在,则会执行此语句,避免因为出错导致
return 0
txt = a.read() #把目标文件读入到字符串txt中,这样里面就是一个包含整个txt文件的字符串
a.close()
fengefujihe = set() #把目标文件中的所有非字母符号放到集合中,集合起到一个不重复的作用
for i in txt:
if not (i >= "a" and i <= "z" or i >= "A" and i <= "Z"):
fengefujihe.add(i)
# 使用 re.escape 自动转义特殊字符
Fengefu = "|".join(re.escape(j) for j in fengefujihe) #re.escape(j)是把每一个j元素中的字符变成能直接转译的字符,而a.join(b)就是把可迭代对象b用字符串a来分割,并组成一个新的字符
lst = re.split(Fengefu, txt) #用Fengefu来分割txt
for k in lst:
if k == "": #有可能出现两个分隔符挨着,然后就会划分出一个空串,如果是空串就不要
continue
danci = k.lower() #不是空串就把字符全部转为小写
if danci in jieguo:
jieguo[danci] += 1 #如果单词之前已经存在,就+1
else:
jieguo[danci] = 1 #不存在就设置为1
return 1
result = {} #用字典的键值对来存储单词和其出现的次数
lst = os.listdir() #列出当前文件下的所有文件和文件夹
for l in lst :
if os.path.isfile(l) : #如果是文件
if l.lower().endswith(".txt") and l.lower().startswith("a") : #且这个文件是a打头,.txt结尾的文件
ScyFilePro(l, result) #调用我们自己写的函数l就是符合条件的文件夹,而result就是上面的那个字典
lst = list(result.items()) #返回字典中的键值对关系
lst.sort() #按字典分类
b = open(sys.argv[1] , "w") #对我们的结果文件进行写入
for m in lst :
b.write("%s\t%d\n" % (m[0], m[1])) #规定输出
b.close()
4、演示部分
我们先新建一个文件夹,里面包含各种各样的文件,文件里面输入一些事先写好的内容:
然后我们在这个目录下右键,选择打开终端,并输出执行文件和结果文件:
执行完毕后,回到刚刚新建的文件夹,打开jieguo.txt,我们会发现所有开头是a(无论大小写),的txt文件都已经被放到结果文件里面进行字频统计(b开头的没有):
以上就是Python与命令行参数的全部内容:)