pythonls
‘壹’ python中执行系统命令常见的几种方法
作为胶水语言,Python可以很方便地执行系统命令,从而帮助我们快速的完成任务;而且Python执行系统命令可采用的方法有很多,本文重点介绍一下:os.system()、os.popen()和subprocess模块。
1. os.system()
这个方法直接调用标准C的system()函数,仅仅在一个子终端运行系统命令,而不能获取执行返回的信息。
>>> import os
>>> output = os.system('cat /proc/cpuinfo')
processor : 0
vendor_id : AuthenticAMD
cpu family : 21
... ...
>>> output # doesn't capture output
0
2. os.popen()
这个方法执行命令并返回执行后的信息对象,是通过一个管道文件将结果返回。
>>> output = os.popen('cat /proc/cpuinfo')
>>> output
>>> print output.read()
processor : 0
vendor_id : AuthenticAMD
cpu family : 21
... ...
>>>
3. subprocess模块
该模块是一个功能强大的子进程管理模块,是替换os.system, os.spawn*等方法的一个模块。
>>> import subprocess
>>> subprocess.Popen(["ls", "-l"]) # python2.x doesn't capture
output
>>> subprocess.run(["ls", "-l"]) # python3.x doesn't capture
output
>>> total 68
drwxrwxr-x 3 xl xl 4096 Feb 8 05:00 com
drwxr-xr-x 2 xl xl 4096 Jan 21 02:58 Desktop
drwxr-xr-x 2 xl xl 4096 Jan 21 02:58 Documents
drwxr-xr-x 2 xl xl 4096 Jan 21 07:44 Downloads
... ...
>>>
‘贰’ python中ls【】【】是什么意思
【CSDN 编者按】Python 风头正盛,未来一段时间内想必也会是热门编程语言之一。因此,熟练掌握 Python 对开发者来说极其重要,说不定能给作为开发者的你带来意想不到的财富。
作者 | Sebastian Opałczyński
编译 | 弯月 责编 | 张文
出品 | CSDN(ID:CSDNnews)
在本文中,我们来看一看日常工作中经常使用的一些 Python 小技巧。
集合
开发人员常常忘记 Python 也有集合数据类型,大家都喜欢使用列表处理一切。
集合(set)是什么?简单来说就是:集合是一组无序事物的汇集,不包含重复元素。
如果你熟练掌握集合及其逻辑,那么很多问题都可以迎刃而解。举个例子,如何获取一个单词中出现的字母?
myword = "NanananaBatman"set(myword){'N', 'm', 'n', 'B', 'a', 't'}
就这么简单,问题解决了,这个例子就来自 Python 的官方文档,大可不必过于惊讶。
再举一个例子,如何获取一个列表的各个元素,且不重复?
# first you can easily change set to list and other way aroundmylist = ["a", "b", "c","c"]# let's make a set out of itmyset = set(mylist)# myset will be:{'a', 'b', 'c'}# and, it's already iterable so you can do:for element in myset:print(element)# but you can also convert it to list again:mynewlist = list(myset)# and mynewlist will be:['a', 'b', 'c']
我们可以看到,“c”元素不再重复出现了。只有一个地方你需要注意,mylist 与 mynewlist 之间的元素顺序可能会有所不同:
mylist = ["c", "c", "a","b"]mynewlist = list(set(mylist))# mynewlist is:['a', 'b', 'c']
可以看出,两个列表的元素顺序不同。
下面,我们来进一步深入。
假设某些实体之间有一对多的关系,举个更加具体的例子:用户与权限。通常,一个用户可以拥有多个权限。现在假设某人想要修改多个权限,即同时添加和删除某些权限,应当如何解决这个问题?
# this is the set of permissions before change;original_permission_set = {"is_admin","can_post_entry", "can_edit_entry", "can_view_settings"}# this is new set of permissions;new_permission_set = {"can_edit_settings","is_member", "can_view_entry", "can_edit_entry"}# now permissions to add will be:new_permission_set.difference(original_permission_set)# which will result:{'can_edit_settings', 'can_view_entry', 'is_member'}# As you can see can_edit_entry is in both sets; so we do notneed# to worry about handling it# now permissions to remove will be:original_permission_set.difference(new_permission_set)# which will result:{'is_admin', 'can_view_settings', 'can_post_entry'}# and basically it's also true; we switched admin to member, andadd# more permission on settings; and removed the post_entrypermission
总的来说,不要害怕使用集合,它们能帮助你解决很多问题,更多详情,请参考 Python 官方文档。
日历
当开发与日期和时间有关的功能时,有些信息可能非常重要,比如某一年的这个月有多少天。这个问题看似简单,但是我相信日期和时间是一个非常有难度的话题,而且我觉得日历的实现问题非常多,简直就是噩梦,因为你需要考虑大量的极端情况。
那么,究竟如何才能找出某个月有多少天呢?
import calendarcalendar.monthrange(2020, 12)# will result:(1, 31)# BUT! you need to be careful here, why? Let's read thedocumentation:help(calendar.monthrange)# Help on function monthrange in mole calendar:# monthrange(year, month)# Return weekday (0-6~ Mon-Sun) and number of days (28-31) for# year, month.# As you can see the first value returned in tuple is a weekday,# not the number of the first day for a given month; let's try# to get the same for 2021calendar.monthrange(2021, 12)(2, 31)# So this basically means that the first day of December 2021 isWed# and the last day of December 2021 is 31 (which is obvious,cause# December always has 31 days)# let's play with Februarycalendar.monthrange(2021, 2)(0, 28)calendar.monthrange(2022, 2)(1, 28)calendar.monthrange(2023, 2)(2, 28)calendar.monthrange(2024, 2)(3, 29)calendar.monthrange(2025, 2)(5, 28)# as you can see it handled nicely the leap year;
某个月的第一天当然非常简单,就是 1 号。但是,“某个月的第一天是周X”,如何使用这条信息呢?你可以很容易地查到某一天是周几:
calendar.monthrange(2024, 2)(3, 29)# means that February 2024 starts on Thursday# let's define simple helper:weekdays = ["Monday", "Tuesday","Wednesday", "Thursday", "Friday","Saturday", "Sunday"]# now we can do something like:weekdays[3]# will result in:'Thursday'# now simple math to tell what day is 15th of February 2020:offset = 3 # it's thefirst value from monthrangefor day in range(1, 29):print(day,weekdays[(day + offset - 1) % 7])1 Thursday2 Friday3 Saturday4 Sunday...18 Sunday19 Monday20 Tuesday21 Wednesday22 Thursday23 Friday24 Saturday...28 Wednesday29 Thursday# which basically makes sense;
也许这段代码不适合直接用于生产,因为你可以使用 datetime 更容易地查找星期:
from datetime import datetimemydate = datetime(2024, 2, 15)datetime.weekday(mydate)# will result:3# or:datetime.strftime(mydate, "%A")'Thursday'
总的来说,日历模块有很多有意思的地方,值得慢慢学习:
# checking if year is leap:calendar.isleap(2021) #Falsecalendar.isleap(2024) #True# or checking how many days will be leap days for given yearspan:calendar.leapdays(2021, 2026) # 1calendar.leapdays(2020, 2026) # 2# read the help here, as range is: [y1, y2), meaning that second# year is not included;calendar.leapdays(2020, 2024) # 1
枚举有第二个参数
是的,枚举有第二个参数,可能很多有经验的开发人员都不知道。下面我们来看一个例子:
mylist = ['a', 'b', 'd', 'c', 'g', 'e']for i, item in enumerate(mylist):print(i, item)# Will give:0 a1 b2 d3 c4 g5 e# but, you can add a start for enumeration:for i, item in enumerate(mylist, 16):print(i, item)# and now you will get:16 a17 b18 d19 c20 g21 e
第二个参数可以指定枚举开始的地方,比如上述代码中的 enumerate(mylist,16)。如果你需要处理偏移量,则可以考虑这个参数。
if-else 逻辑
你经常需要根据不同的条件,处理不同的逻辑,经验不足的开发人员可能会编写出类似下面的代码:
OPEN = 1IN_PROGRESS = 2CLOSED = 3def handle_open_status():print('Handling openstatus')def handle_in_progress_status():print('Handling inprogress status')def handle_closed_status():print('Handling closedstatus')def handle_status_change(status):if status == OPEN:handle_open_status()elif status ==IN_PROGRESS:handle_in_progress_status()elif status == CLOSED:handle_closed_status()handle_status_change(1) #Handling open statushandle_status_change(2) #Handling in progress statushandle_status_change(3) #Handling closed status
虽然这段代码看上去也没有那么糟,但是如果有 20 多个条件呢?
那么,究竟应该怎样处理呢?
from enum import IntEnumclass StatusE(IntEnum):OPEN = 1IN_PROGRESS = 2CLOSED = 3def handle_open_status():print('Handling openstatus')def handle_in_progress_status():print('Handling inprogress status')def handle_closed_status():print('Handling closedstatus')handlers = {StatusE.OPEN.value:handle_open_status,StatusE.IN_PROGRESS.value: handle_in_progress_status,StatusE.CLOSED.value:handle_closed_status}def handle_status_change(status):if status not inhandlers:raiseException(f'No handler found for status: {status}')handler =handlers[status]handler()handle_status_change(StatusE.OPEN.value) # Handling open statushandle_status_change(StatusE.IN_PROGRESS.value) # Handling in progress statushandle_status_change(StatusE.CLOSED.value) # Handling closed statushandle_status_change(4) #Will raise the exception
在 Python 中这种模式很常见,它可以让代码看起来更加整洁,尤其是当方法非常庞大,而且需要处理大量条件时。
enum 模块
enum 模块提供了一系列处理枚举的工具函数,最有意思的是 Enum 和 IntEnum。我们来看个例子:
from enum import Enum, IntEnum, Flag, IntFlagclass MyEnum(Enum):FIRST ="first"SECOND ="second"THIRD ="third"class MyIntEnum(IntEnum):ONE = 1TWO = 2THREE = 3# Now we can do things like:MyEnum.FIRST ## it has value and name attributes, which are handy:MyEnum.FIRST.value #'first'MyEnum.FIRST.name #'FIRST'# additionally we can do things like:MyEnum('first') #, get enum by valueMyEnum['FIRST'] #, get enum by name
使用 IntEnum 编写的代码也差不多,但是有几个不同之处:
MyEnum.FIRST == "first" # False# butMyIntEnum.ONE == 1 # True# to make first example to work:MyEnum.FIRST.value == "first" # True
在中等规模的代码库中,enum 模块在管理常量方面可以提供很大的帮助。
enum 的本地化可能有点棘手,但也可以实现,我用django快速演示一下:
from enum import Enumfrom django.utils.translation import gettext_lazy as _class MyEnum(Enum):FIRST ="first"SECOND ="second"THIRD ="third"@classmethoddef choices(cls):return [(cls.FIRST.value, _('first')),(cls.SECOND.value, _('second')),(cls.THIRD.value, _('third'))# And later in eg. model definiton:some_field = models.CharField(max_length=10,choices=MyEnum.choices())
iPython
iPython 就是交互式 Python,它是一个交互式的命令行 shell,有点像 Python 解释器。
首先,你需要安装 iPython:
pip install ipython
接下来,你只需要在输入命令的时候,将 Python 换成 ipython:
# you should see something like this after you start:Python 3.8.5 (default, Jul 28 2020, 12:59:40)Type 'right', 'credits' or 'license' for more informationIPython 7.18.1 -- An enhanced Interactive Python. Type '?' forhelp.In [1]:
ipython 支持很多系统命令,比如 ls 或 cat,tab 键可以显示提示,而且你还可以使用上下键查找前面用过的命令。更多具体信息,请参见官方文档。
参考链接:https://levelup.gitconnected.com/python-tricks-i-can-not-live-without-87ae6aff3af8
‘叁’ Python语言li=[]和ls=[]意思一样吗
肯定不一样,一个是定义了名为li的空列表,一个是ls空列表
‘肆’ python shell是什么东西
python shell是Python的命令行。
shell中最常用的是ls命令,python对应的写法是:os.listdir(dirname),这个函数返回字符串行表,里面是所有的文件名,不过不包含”.”和”..”。
如果要遍历整个目录的话就会比较复杂一点,在解释器里试一下:
>>> os.listdir(”/”)
[’tmp’, ‘misc’, ‘opt’, ‘root’, ‘.autorelabel’, ’sbin’, ’srv’,‘.autofsck’, ‘mnt’, ‘usr’, ‘var’, ‘etc’, ’selinux’, ‘lib’, ‘net’,‘lost+found’, ’sys’, ‘media’, ‘dev’, ‘proc’, ‘boot’, ‘home’, ‘bin’]
就像这样,接下去所有命令都可以在python的解释器里直接运行观看结果。
(4)pythonls扩展阅读:
python shell对应于shutil.(src,dest),这个函数有两个参数,参数src是指源文件的名字,参数dest则是目标文件或者目标目录的名字。
如果dest是一个目录名,就会在那个目录下创建一个相同名字的文件。与shutil.函数相类似的是shutil.2(src,dest),不过2还会复制最后存取时间和最后更新时间。
不过,shell的cp命令还可以复制目录,python的shutil.却不行,第一个参数只能是一个文件。
其实,python还有个shutil.tree(src,dst[,symlinks])。参数多了一个symlinks,它是一个布尔值,如果是True的话就创建符号链接。
移动或者重命名文件和目录,shutil.move(src,dst),与mv命令类似,如果src和dst在同一个文件系统上,shutil.move只是简单改一下名字,如果src和dst在不同的文件系统上,shutil.move会先把src复制到dst,然后删除src文件。
‘伍’ python编写函数,随机产生20个两位的正整数存入列表ls中,返回列表中低于平均值的数有多少
#!/usr/bin/python3
# -*- coding:utf-8 -*-
"""
@author:Strom_ck
@file :20200622_01.py
@time :2020/6/22 13:47
"""
"""
随机产生20个两位的正整数存入列表ls中,返回列表中低于平均值的数有多少
"""
if __name__ == "__main__":
from random import randint as rd
olist = []
for i in range(20):
olist.append(rd(10, 99))
avg = sum(olist) / 20
result_list = [t for t in olist if t < avg]
print("小于平均值的数有{}个".format(len(result_list)))
print("小于平均数的是:{}".format(result_list))
‘陆’ Python中ls【3】表示什么
题主你好,
举个例子你应该就明白了:
ls = ['张三', '李四', '王五', '赵六']
我要引用 ' 张三 ', 可以使用:
ls[0]
我要引用 ' 李四 ', 可以使用:
ls[1]
我要引用 ' 王五 ', 可以使用:
ls[2]
我要引用 ' 赵六 ', 可以使用:
ls[3]
------------
通过上面这个例子再去理解ls[3],可以将ls理解为一个容器, 这个容器中按顺序放着很多东西,我们可以通过这个东西的编号去把这个东西取出来, 需要注意的是编号是从0开始的,即容器中第1个东西的编号是0.
希望可以帮到题主, 欢迎追问
‘柒’ python中 ls.strip(' ') 与ls.strip()一个意思吗
s.lstrip(rm) :删除s字符串中开头处。位于 rm删除序列的字符
如今来分析s.strip(rm)这个函数。
如今如果s=‘abcd’
则 s.strip(‘bd’)————->’abc’
而s.strip(‘ba’)和s.strip(‘ab’)的结果是一样的,都是’cd’
而s.strip(‘bd’)得到的结果是’abc’,于是我就不理解了
于是我继续尝试,发现s.strip(‘bac’)———->’d’
非常多博客都是这样说明了下,然后就没有然后了,都没有解释究竟是怎么工作的,为什么会产生这种原因,不知是过于简单所以别人都没有进行解说还是我过于笨拙。没能理解。
产生这种原因我的理解例如以下:s.strip(rm)首先检查字符串s中的首尾字符是否在rm中。如存在则将字符从中删除,并用删除字符后的字符串继续检查首尾字符是否出如今rm中。如此下去,并返回最后的结果。
上面可能说的比较抽象,以上面的样例 s.strip(‘ba’)为例,经历了几下几步
第一步:字符串s=‘abcd’先检查其首尾字符是否出如今rm=’ba’中,发现首字符’a’存在于rm=’ba’中,于是将’abcd’中的’a’字符从中删除,得到’bcd’字符串
第二步:再继续检查所得字符串’bcd’的首尾字符是否出如今rm=’ba’中。发现首字符’b’存在,则将’bcd’中的字符’b’从中删除,得到’cd’字符串
第三步:再继续检查所得字符串’cd’中的首尾字符是否小狐仙在rm=’ba’中,发现没有。则将其返回,结束。
‘捌’ 在python中,ls[i:j]怎么用
这就是序列对象切片的用法。
i是起始下标(结果中包括此元素),j是结束下标(结果中不包括此元素)。
如下是一个例子:
l=[1,2,3,4,5,6,7,8,9]
t=(9,8,7,6,5,4,3,2,1)
s='abcdefg'
b=b'gfedcba'
r=range(11,101)
print(l[2:5])
print(t[3:8])
print(s[1:5])
print(b[1:6])
print(r[0:7])
如下是运行截图:
‘玖’ python ls home 并不会显示里面的文件
ls显示的是目录下的文件。不能显示文件内容。
ls不是python的命令
你要看文件的内容 ,可以 cat "你的文件"
‘拾’ python,列表ls[2][-1][0]命令是什么意思
ls 这个变量应该是个多维数组
你可以依次这样去理解 ls[2] 表示取 ls下标为2的值(从左到右的第三个,因为下标是从0开始的)
然后在 对ls[2]下的值 取[-1]的值 (-1表示列表元素的最后一个)
然后在 对ls[2][-1]下的值[0]的值(0表示列表元素的第一个)