python文件操作glob_os_等對比


Python標准庫glob介紹

一、 glob模塊通配符

通配符 功能

*

匹配0或多個字符

**

匹配所有文件,目錄,子目錄和子目錄里面的文件 (3.5版本新增)

匹配一個字符,這里與正則表達式? (正則?匹配前面表達式0次或者1次)

[]

匹配指定范圍內的字符,如: [1-9]匹配1至9內的字符

[!]

匹配不在指定范圍內的字符

1、通配符

星號(*)匹配零個或多個字符

import glob
for name in glob.glob('dir/*'):
    print (name)
dir/file.txt
dir/file1.txt
dir/file2.txt
dir/filea.txt
dir/fileb.txt
dir/subdir

列出子目錄中的文件,必須在模式中包括子目錄名:

import glob

#用子目錄查詢文件
print ('Named explicitly:')
for name in glob.glob('dir/subdir/*'):
    print ('\t', name)
#用通配符* 代替子目錄名
print ('Named with wildcard:')
for name in glob.glob('dir/*/*'):
    print ('\t', name)
Named explicitly:
        dir/subdir/subfile.txt
Named with wildcard:
        dir/subdir/subfile.txt

2、單個字符通配符

用問號(?)匹配任何單個的字符。

import glob

for name in glob.glob('dir/file?.txt'):
    print (name)
dir/file1.txt
dir/file2.txt
dir/filea.txt
dir/fileb.txt

3、字符范圍

當需要匹配一個特定的字符,可以使用一個范圍

import glob
for name in glob.glob('dir/*[0-9].*'):
    print (name)
dir/file1.txt
dir/file2.txt

二、glob模塊iglob 返回iterator執行效率更高

1.當前路徑文件tmp下py文件,使用iglob,返回迭代器效率更高

for fname in glob.iglob("./tmp/*.py"):
    print(fname)

三、其他

1.轉移字符

specials = '?*['

for char in specials:
    pattern = '**/*' + glob.escape(char) + '.txt'
    print('Searching for: {!r}'.format(pattern))
    for name in sorted(glob.glob(pattern,recursive=True)):
        print(name)
    print()

 

Python標准庫OS介紹

os模塊的常見功能

os模塊自帶的文件和文件夾操作方法都非常有用。

  • 得到當前工作目錄的路徑: os.getcwd()

  • 改變當前工作目錄: os.chdir(path)

  • 返回指定目錄下的所有文件和目錄名:os.listdir(path)

  • 函數用來刪除一個文件:os.remove(path)和os.unlink(path)

  • 檢驗給出的路徑是否是一個文件:os.path.isfile(path)

  • 檢驗給出的路徑是否是一個目錄:os.path.isdir(path)

  • 判斷是否是絕對路徑:os.path.isabs()

  • 檢查是否快捷方式os.path.islink (filename )

  • 檢驗給出的路徑是否真地存在:os.path.exists(path)

  • 返回一個路徑的目錄名和文件名:os.path.split() eg os.path.split('/home/python/django.html') 結果:('/home/python', 'django.html')

  • 拼接工作路徑: os.path.join(str1, str2, str3..)

  • 分離擴展名:os.path.splitext()

  • 獲取路徑名:os.path.dirname(path)

  • 獲取文件名:os.path.basename()

  • 運行shell命令: os.system()

  • 讀取和設置環境變量:os.getenv() 與os.putenv()

  • 給出當前平台使用的行終止符:os.linesep Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'

  • 指示你正在使用的平台:os.name 對於Windows,它是'nt',而對於Linux/Unix用戶,它是'posix'

  • 重命名:os.rename(old, new)

  • 創建多級目錄:os.makedirs(r“c:\python\test”)

  • 創建單個目錄:os.mkdir(“test”)

  • 刪除單個目錄: os.rmdir(“test"

  • 刪除多個目錄:os.removedirs(r“c:\folder”)

  • 獲取文件屬性:os.stat()

  • 修改文件權限與時間戳:os.chmod()

  • 終止當前進程:os.exit()

  • 獲取文件大小:os.path.getsize(filename)

值得注意的是windows和Linux采用了不同的路徑分隔符(“/”和"\"。我最喜歡的方法是os.path.join方法,提高了我們代碼可移植性。比如下面代碼:

os.path.join("python", "django", "some.py")
  • 在windows下返回python\django\some.py

  • 在linux下返回python/django/some.py

 

我們接下來看幾個利用os模塊操作文件的實際案例。

查找某個目錄下的全部txt文件並刪除。

假設我們在當前工作目錄下有個叫tutorial的文件夾,我們要把里面的txt文件,刪除,我們可以這么做:

>>> import os
>>> os.getcwd() # 獲取當前工作目錄
'C:\\Users\\MissEnka\\Python'
>>> os.listdir('tutorial') # 查看tutorial文件夾
['notes.txt', 'pdf docs', 'txtfiles']
>>> for filename in os.listdir('tutorial'):
    if filename.endswith('.txt'):
        os.remove(os.path.join('tutorial', filename))
        print("{} deleted.".format(filename))

notes.txt deleted.

上段代碼有2點需要你注意的地方,你發現沒有?

  • 我們只刪除了tutorial文件下的notes.txt文件,並沒有刪除子文件夾txtfiles里的.txt文件。想要遍歷一個文件夾,查找所有目錄包括子目錄的文件,我們需要用到下面會提到的os.walk()方法。

  • 我們用的os.remove(os.path.join("tutorial"), filename))而不是簡單用os.remove(filename)來刪除文件,這是因為notes.txt相對於當前工作目錄的路徑是/tutorial/notes.txt, 而不是notes.txt。

 

使用os.walk()遍歷一個文件夾子目錄查找所有txt文件並刪除

>>> for foldName, subfolders, filenames in os.walk('tutorial'):
    for filename in filenames:
      if filename.endswith('.txt'):
         os.remove(os.path.join(foldName, filename))
         print("{} deleted.".format(filename))

用os.walk()打印出某個文件夾下所有子目錄和文件名稱方法如下。來源: Automate the boring stuff with Python。

import os
folderName, subfolders, filenames in os.walk('directory'):
    print('The current folder is ' + folderName)

    for subfolder in subfolders:
        print('SUBFOLDER OF ' + folderName + ': ' + subfolder)
    for filename in filenames:
        print('FILE INSIDE ' + folderName + ': '+ filename)

    print('')

 

利用shutil模塊復制和移動文件

shutil模塊可以用來復制和移動一個文件。shutil.copy()用來復制文件,第一個參數是需要復制的文件,第二個參數可以是文件夾,也可以是個文件名。如果是文件夾,新文件將存儲在新文件夾里,文件名不變。如果是文件名,則新文件直接以文件名命名。shutil.copyfile()與shutil.copy()類似,只不過2個參數都必需是文件名。

>> import shutil
>> import os
>> os.chdir('C:\\')
>> shutil.copy('C:\\spam.txt', 'C:\\delicious')
'C:\\delicious\\spam.txt'
>> shutil.copy('eggs.txt', 'C:\\delicious\\eggs2.txt')
'C:\\delicious\\eggs2.txt'

shutil還常用來復制文件夾或移動文件,代碼如下:

# 復制文件夾. olddir和newdir都只能是目錄,且newdir必須不存在
shutil.copytree("老目錄", "新目錄")

# 移動文件(目錄)
shutil.move("老位置", "新位置") 

 

參考博客

https://www.jianshu.com/p/05e5cebbc55e

https://www.jianshu.com/p/32e3364b22ee

https://blog.csdn.net/weixin_42134789/article/details/80362826


免責聲明!

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



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