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表示列表元素的第一個)