溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么用Python自動(dòng)化處理文件

發(fā)布時(shí)間:2021-06-21 15:51:33 來源:億速云 閱讀:124 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“怎么用Python自動(dòng)化處理文件”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

一、生成隨機(jī)的測驗(yàn)試卷文件

假如你是一位地理老師, 班上有 35 名學(xué)生, 你希望進(jìn)行美國各州首府的一個(gè)小測驗(yàn)。不妙的是,班里有幾個(gè)壞蛋, 你無法確信學(xué)生不會(huì)作弊。你希望隨機(jī)調(diào)整問題的次序, 這樣每份試卷都是獨(dú)一無二的, 這讓任何人都不能從其他人那里抄襲答案。當(dāng)然,手工完成這件事又費(fèi)時(shí)又無聊。
下面是程序所做的事:

? 創(chuàng)建 35 份不同的測驗(yàn)試卷。

? 為每份試卷創(chuàng)建 50 個(gè)多重選擇題,次序隨機(jī)。

? 為每個(gè)問題提供一個(gè)正確答案和 3 個(gè)隨機(jī)的錯(cuò)誤答案,次序隨機(jī)。

? 將測驗(yàn)試卷寫到 35 個(gè)文本文件中。

? 將答案寫到 35 個(gè)文本文件中。

這意味著代碼需要做下面的事:

? 將州和它們的首府保存在一個(gè)字典中。

? 針對測驗(yàn)文本文件和答案文本文件,調(diào)用 open()、 write()和 close()。

? 利用 random.shuffle()隨機(jī)調(diào)整問題和多重選項(xiàng)的次序。

代碼:

import random

#問題的數(shù)據(jù)保存在字典中,詩歌名稱作為鍵,作者作為值。
poems={'1+3':'4',
'6+7':'13',
'9*3':'27',
'40-1':'39',
'38-13':'25'

}
#我們可以用上面的字典隨機(jī)的出5份試卷
for num in range(5):
     #創(chuàng)建試卷和答案文本文件
     testFile = open('poem_test%s.txt' % (num + 1),'w')
     answerFile = open('poem_answer%s.txt' % (num + 1),'w')

     #創(chuàng)建試卷的頭部格式
     testFile.write('姓名:\n\n日期:\n\n年級:\n\n')
     testFile.write('試卷號(hào):%s' %(num + 1))
     testFile.write('\n\n\n')

     #隨機(jī)獲取詩歌名稱
     names = list(poems.keys())
     random.shuffle(names)
#創(chuàng)建答案選項(xiàng),這個(gè)for循環(huán)是要包含在上面一個(gè)for循環(huán)中的,因?yàn)榕秱冃枰獮槊恳粋€(gè)文件創(chuàng)建選項(xiàng)。

 for questionNum in range(10):
          #試卷的正確的選項(xiàng),就是names列表中的值在字典中對應(yīng)的作者
          correctAnswer = poems[names[questionNum]]
          #試卷的錯(cuò)誤的選項(xiàng),就是字典中所有的值
          #然后在每次循環(huán)過程中去掉其中的正確的那一項(xiàng),
          wrongAnswers = list(poems.values())
          del wrongAnswers[wrongAnswers.index(correctAnswer)]
          #隨機(jī)選擇三個(gè)錯(cuò)誤的答案
          #random中sample(seq, n)函數(shù):從序列seq中選擇n個(gè)隨機(jī)且獨(dú)立的元素;
          wrongAnswers = random.sample(wrongAnswers,3)
          #問題單包含的四個(gè)選項(xiàng)
          answerOptions = wrongAnswers + [correctAnswer]
          #打亂答案順序
          random.shuffle(answerOptions)

#第四步:將內(nèi)容寫入測驗(yàn)試卷和答案文件
#將問題和答案寫入文件中,\表示一行代碼寫不下可以換多行
          testFile.write('%s,%s的答案是:\n' % \
                         (questionNum + 1,names[questionNum]))
          for i in range(4):
               testFile.write('%s. %s\n'%('ABCD'[i],answerOptions[i]))
          testFile.write('\n')

          #寫入答案
          answerFile.write('%s.%s\n' % (questionNum + 1,'ABCD'\
                                        [answerOptions.index(correctAnswer)]))
     testFile.close()
     answerFile.close()

二、使用Python創(chuàng)建并寫入新文件

本節(jié)將介紹如何用程序組織硬盤上已經(jīng)存在的文件。不知你是否經(jīng)歷過查找一個(gè)文件夾,里面有幾十個(gè)、幾百個(gè)、甚至上千個(gè)文件,需要手工進(jìn)行復(fù)制、改名、移動(dòng)或壓縮。比如下列這樣的任務(wù):

? 在一個(gè)文件夾及其所有子文件夾中,復(fù)制所有的 pdf 文件(且只復(fù)制 pdf 文件)

? 針對一個(gè)文件夾中的所有文件,刪除文件名中前導(dǎo)的零,該文件夾中有數(shù)百個(gè)文件,名為 spam001.txt、 spam002.txt、 spam003.txt 等。

? 將幾個(gè)文件夾的內(nèi)容壓縮到一個(gè) ZIP 文件中(這可能是一個(gè)簡單的備份系統(tǒng))

所有這種無聊的任務(wù),正是在請求用 Python 實(shí)現(xiàn)自動(dòng)化。通過對電腦編程來完成這些任務(wù),你就把它變成了一個(gè)快速工作的文件職員,而且從不犯錯(cuò)。

  • get_all_file_by_type() :根據(jù)接收到的path 和type,獲得該path下所有以type類型結(jié)尾的文件

  • get_all_file_by_string(): 根據(jù)接收到的path 和 list, 獲得該path下所有的,包含list 里字符串的文件

  • copy_file_by_type(): 根據(jù)接收到的old_path,和type,調(diào)用get_all_file_by_type()方法。根據(jù)條件選擇不同的執(zhí)行代碼

  • copy_file_by_string():同理,不過它調(diào)用的是get_all_file_by_string()方法


#python創(chuàng)建并寫入新文件,

#python統(tǒng)計(jì)特定文件夾下的word和pdf的數(shù)量
import glob,os

# path就是你說的特定文件夾
path = r"D:\linshi"

# 這里的pdf可以換成docx
file=glob.glob(os.path.join(path, "*.pdf"))

count = 0

for i in file:
    count = count + 1
    
print(count)
#復(fù)制文件的完整路徑借助python對該文件夾的文件批量復(fù)制到另一個(gè)指定文件夾中。有兩種模式,一種只復(fù)制文件。第二種復(fù)制文件的完整路徑

import os
import shutil

def get_all_file_by_type(path, type=()):  # 獲得以type類型結(jié)尾的所有文件,返回一個(gè)list

    filelist = []

    for a, b, c in os.walk(path):
        for name in c:
            fname = os.path.join(a, name)
            if fname.endswith(type):
                filelist.append(fname)

    return filelist


def get_all_file_by_string(path, string_list):
    filelist = []

    for a, b, c in os.walk(path):
        for name in c:
            fname = os.path.join(a, name)
            for string in string_list:  # 遍歷string_list,如果文件路徑中包含string,那么append進(jìn)filelist
                if string in fname:  # 如果只想要文件名符合條件,把fname換成name即可
                    filelist.append(fname)
                    break

    return filelist


def copy_file_by_type(old_path, new_path, type=('doc', 'docx'), requird_dir=False):
    try:
        file_list = get_all_file_by_type(old_path, type=type)  # 獲得該路徑下所有的type類型文件

        if not os.path.exists(new_path):  # 創(chuàng)建新的文件夾
            os.makedirs(new_path)

        if not requird_dir:  # 如果僅復(fù)制文件
            for file in file_list:
                name = file.split("\\")[-1]  # 獲得文件名字

                new_paths = os.path.join(new_path, name)  # 與新路徑拼接,獲得完整的新路徑
                shutil.copy(file, new_paths)
                print(new_paths + "成功")

        if requird_dir:
            for file in file_list:
                name = file.split("\\")[-1]  # 獲得文件名字
                new_paths = file.replace(old_path, new_path)  # 將一個(gè)完整路徑中,開始的路徑替換成新的路徑
                dir = new_paths.split(name)[0]  # 獲得文件夾路徑
                if not os.path.exists(dir):  # 創(chuàng)建新文件夾
                    os.makedirs(dir)
                shutil.copy(file, new_paths)
                print(new_paths + "成功")
    except Exception as e:
        print(e)


def copy_file_by_string(old_path, new_path, string_list, requird_dir=False):
    try:
        file_list = get_all_file_by_string(old_path, string_list=string_list)  # 與上述一樣,只不過這里調(diào)用的是get_all_file_by_string方法

        if not os.path.exists(new_path):
            os.makedirs(new_path)

        if not requird_dir:
            for file in file_list:
                name = file.split("\\")[-1]

                new_paths = os.path.join(new_path, name)
                shutil.copy(file, new_paths)
                print(new_paths + "成功")

        if requird_dir:
            for file in file_list:
                name = file.split("\\")[-1]
                new_paths = file.replace(old_path, new_path)
                print(new_paths)
                dir = new_paths.split(name)[0]
                if not os.path.exists(dir):
                    os.makedirs(dir)
                shutil.copy(file, new_paths)
                print(new_paths + "成功")
    except Exception as e:
        print(e)


if __name__ == '__main__':
    old_path = r"F:\aaaa"
    new_path = r"F:\bbbb"

    list = ["面試", "筆試", "題庫", "題目"]
    copy_file_by_string(old_path=old_path, new_path=new_path, string_list=list, requird_dir=False)

    # type = ('docx','doc',"pdf","md")
    # copy_file_by_type(old_path=old_path, new_path=new_path, type=type, requird_dir=True)

#python壓縮多個(gè)文件到zip格式-zipfile包實(shí)例
pip install zipfile
file=r'D:\test.zip'
out_path=r'D:\files'
#遍歷files文件夾下的文件,壓縮發(fā)送
zip_1=zipfile.ZipFile(file,'w')
	for f in os.listdir(out_path):
		zip_1.write(os.path.join(out_path,f),f,zipfile.ZIP_DEFLATED)
zip_1.close()

#python批量刪除文件名_Python批量修改文件名
import os, re

while True:

keyword = input("請輸入你要?jiǎng)h除的字符串:")

if len(keyword)==0 or keyword.isspace():

print("字符串不能為空!")

else:

break

suffix = input("需要篩選的文件名后綴(Enter代表所有):")

fileNames = os.listdir()  #獲取當(dāng)前目錄下的所有文件

for file in fileNames:

check = os.path.join(os.path.abspath('.'),file)

if os.path.isfile(check):

if len(suffix)==0 or suffix.isspace():

if keyword in file:

print(file," -> ",file.replace(keyword,''))

os.rename(file,file.replace(keyword,''))

else:

#用正則表達(dá)式匹配后綴名

if re.match('.+?\.'+suffix+'$',file) != None and keyword in file:

print(file," -> ",file.replace(keyword,''))

os.rename(file,file.replace(keyword,''))

1)、編寫一個(gè)程序,遍歷一個(gè)目錄樹,查找特定擴(kuò)展名的文件(諸如.pdf 或.jpg)。不論這些文件的位置在哪里, 將它們拷貝到一個(gè)新的文件夾中。

2) 、一些不需要的、 巨大的文件或文件夾占據(jù)了硬盤的空間, 這并不少見。如果你試圖釋放計(jì)算機(jī)上的空間, 那么刪除不想要的巨大文件效果最好。但首先你必須找到它們。編寫一個(gè)程序, 遍歷一個(gè)目錄樹, 查找特別大的文件或文件夾, 比方說, 超過100MB 的文件(回憶一下,要獲得文件的大小,可以使用 os 模塊的 os.path.getsize())。將這些文件的絕對路徑打印到屏幕上。

3)、編寫一個(gè)程序, 在一個(gè)文件夾中, 找到所有帶指定前綴的文件, 諸如 spam001.txt,spam002.txt 等,并定位缺失的編號(hào)(例如存在 spam001.txt 和 spam003.txt, 但不存在 spam002.txt)。讓該程序?qū)λ泻竺娴奈募拿?消除缺失的編號(hào)。作為附加的挑戰(zhàn),編寫另一個(gè)程序,在一些連續(xù)編號(hào)的文件中,空出一些編號(hào),以便加入新的文件。

“怎么用Python自動(dòng)化處理文件”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI