Python 條件表達式


問題:獲得目錄中的 .fna 后綴的文件路徑

  • 通過 makeblastdb 能獲得用於 BLAST 的數據庫文件,這些文件包括原始數據 .fna,和幾個在原名基礎上增加后綴為名字的文件,例如 .fna.nsq
  • Blast 的時候需要指定的是 .fna文件,而不是其他的那些。因此需要自動讀取數據庫文件夾中的不帶后綴的文件。
  • 如果做的是蛋白質的數據庫,需要的是 .faa 的文件。

解決

  • 直接用 in 不能篩選出 .fna結尾 的名字。需要使用正則表達式。
import os
import re
mask = re.compile('.+fna$') # $說明從后開始匹配

# 最好先看一下當前路徑是什么
os. getcwd()

# 獲得文件夾里面所以文件名
file_names= os.listdir()

# 或者隨便用個例子
file_names = ['1.fna', '1.fna.nsq', '1.fna.nsi',]

# 方法1 for循環,遍歷每個文件名,返回fna結尾的文件(事先知道只有一個)

for db in file_names:
    if mask.match(db):
        path = db
path

# 方法2 方法1用條件表達式寫出來
path = [db for db in file_names if mask.match(db)] # 注意[ ]不能少
path

# 方法3 filter 函數
path = list(filter(mask.match, file_names))[0]
path


# 以上三個path都會是1.fna
# 把這個和當前的目錄組合起來就是數據庫所在的路徑
print(os.path.join(os.getcwd(),path))

說明

搜問題的時候看到了第二種寫法,覺得挺有趣的,就稍微看了下。

如何理解conditional expression

a, b, c = 1, 2, 3

# 1.常規

if a>b:
    c = a
else:
    c = b

# 2.表達式
c = a if a>b else b # 先執行中間的if,如果返回True,就是左邊,False是右邊。

# 3.二維列表
c = [b,a][a>b] #實際是[b,a][False],因為False被轉換為0,所以是[1,2][0],也就是[1]
                      # False返回第一個,True 返回第一個。

# 4
c = (a>b and [a] or [b])[0]
# 這個比較好玩,False and [1] or [2],因為and的優先級高於or,先算and
# False和[1] and之后還是False,和[2]or之后卻成了[2]
# True 和[1] and之后是[1],[1]和[2]or結果是[1]
# 也就是False和True在和別人做boolean運算的時候,根據and還是or,F和T在前在后有不一樣的數據轉換規則。

參考

Python關於條件表達式的說明 PEP308


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM