[python]《Python編程快速上手:讓繁瑣工作自動化》學習筆記2

1. 讀寫文件(第8章)

1.1 文件與文件路徑
通過import os調用os模塊操作目錄,常用函數如下:

函數 用途
os.getcwd() 取得當前工作路徑
os.chdir() 改變當前工作路徑
os.makedirs(path) 創建新文件夾
os.listdir(path) 返回文件名字符串的列表
os.path.join(path1,path2,…) 連接路徑
os.path.abspath(path) 返回絕對路徑
os.path.isabs(path) 檢查是否絕對路徑
os.path.relpath(path, start) 返回從start路徑到path的相對路徑
os.path.dirname(path) 返回目錄名
os.path.basename(path) 返回文件名
os.path.split(path) 返回目錄名和文件名的元組
os.path.getsize(path) 返回path參數中文件的字節數
os.path.exists(path) 檢查路徑是否存在
os.path.isfile(path) 檢查路徑是否文件
os.path.isdir(path) 檢查路徑是否文件夾

1.2 文件讀寫

在Python 中,讀寫文件有3 個步驟:

  1. 調用open()函數,返回一個File 對象。
  2. 調用File 對象的read()或write()方法。
  3. 調用File 對象的close()方法,關閉該文件
# 將'w'作爲第二個參數傳遞給open(),以寫模式打開該文件
# 寫模式會清空源文件
baconFile = open('bacon.txt', 'w')
baconFile.write('Hello world!\n')
baconFile.close()

# 將'a'作爲第二個參數傳遞給open(),以添加模式打開該文件
# 添加模式將在已有文件的末尾添加文本
baconFile = open('bacon.txt', 'a')
baconFile.write('Bacon is not a vegetable.')
baconFile.close()

# 讀文件
baconFile = open('bacon.txt')
# read將文件的內容看成是單個大字符串
content = baconFile.read()
# readlines從該文件取得一個字符串的列表。列表中的每個字符串就是文本中的每一行
# content = baconFile.readlines()
baconFile.close()
print(content)
Hello world!
Bacon is not a vegetable.

2. 項目練習

2.1 生成隨機的測驗試卷文件

# -*- coding: utf-8 -*-
import random


# 測驗數據
# The quiz data. Keys are states and values are their capitals.
capitals = {'Alabama': 'Montgomery', 'Alaska': 'Juneau', 'Arizona': 'Phoenix',
'Arkansas': 'Little Rock', 'California': 'Sacramento', 'Colorado': 'Denver',
'Connecticut': 'Hartford', 'Delaware': 'Dover', 'Florida': 'Tallahassee',
'Georgia': 'Atlanta', 'Hawaii': 'Honolulu', 'Idaho': 'Boise', 'Illinois':
'Springfield', 'Indiana': 'Indianapolis', 'Iowa': 'Des Moines', 'Kansas':
'Topeka', 'Kentucky': 'Frankfort', 'Louisiana': 'Baton Rouge', 'Maine':
'Augusta', 'Maryland': 'Annapolis', 'Massachusetts': 'Boston', 'Michigan':
'Lansing', 'Minnesota': 'Saint Paul', 'Mississippi': 'Jackson', 'Missouri':
'Jefferson City', 'Montana': 'Helena', 'Nebraska': 'Lincoln', 'Nevada':
'Carson City', 'New Hampshire': 'Concord', 'New Jersey': 'Trenton', 'New Mexico': 'Santa Fe', 'New York': 'Albany', 'North Carolina': 'Raleigh',
'North Dakota': 'Bismarck', 'Ohio': 'Columbus', 'Oklahoma': 'Oklahoma City',
'Oregon': 'Salem', 'Pennsylvania': 'Harrisburg', 'Rhode Island': 'Providence',
'South Carolina': 'Columbia', 'South Dakota': 'Pierre', 'Tennessee':
'Nashville', 'Texas': 'Austin', 'Utah': 'Salt Lake City', 'Vermont':
'Montpelier', 'Virginia': 'Richmond', 'Washington': 'Olympia', 
'West Virginia': 'Charleston', 'Wisconsin': 'Madison', 'Wyoming': 'Cheyenne'}
    
    
# 生成試卷
# 試卷份數    
n_quiz=2
for quizNum in range(n_quiz):
    # Create the quiz and answer key files.
    # 試卷
    quizFile = open('capitalsquiz%s.txt' % (quizNum + 1), 'w')
    # 答案
    answerKeyFile = open('capitalsquiz_answers%s.txt' % (quizNum + 1), 'w')
    # Write out the header for the quiz.
    # 頭文件
    quizFile.write('Name:\n\nDate:\n\nPeriod:\n\n')
    quizFile.write((' ' * 20) + 'State Capitals Quiz (Form %s)' % (quizNum + 1))
    quizFile.write('\n\n')
    # Shuffle the order of the states.
    states = list(capitals.keys())
    # 創建了美國州名的隨機列表
    random.shuffle(states)    
    
    
    # 創建答案    
    # Loop through all 50 states, making a question for each.
    for questionNum in range(50):
        # Get right and wrong answers.
        # 正確答案
        correctAnswer = capitals[states[questionNum]]
        # 錯誤答案
        wrongAnswers = list(capitals.values())
        # 刪除正確的答案
        del wrongAnswers[wrongAnswers.index(correctAnswer)]
        # 隨機取出三個答案
        wrongAnswers = random.sample(wrongAnswers, 3)
        answerOptions = wrongAnswers + [correctAnswer]
        random.shuffle(answerOptions)    
    
        # 將內容寫入測驗試卷和答案文件
        # Write the question and the answer options to the quiz file.
        quizFile.write('%s. What is the capital of %s?\n' % (questionNum + 1,states[questionNum]))
        
    
        for i in range(4):
            quizFile.write(' %s. %s\n' % ('ABCD'[i], answerOptions[i]))
        quizFile.write('\n')
        
        # Write the answer key to a file.   
        answerKeyFile.write('%s. %s\n' % (questionNum + 1, 'ABCD'[answerOptions.index(correctAnswer)]))
    quizFile.close()
    answerKeyFile.close()    

2.2 瘋狂填詞

創建一個瘋狂填詞(Mad Libs)程序,它將讀入文本文件,並讓用戶在該文本文件中出現ADJECTIVE、NOUN、ADVERB 或VERB 等單詞的地方,加上他們自己的文本。

import re

# text:
'''
The ADJECTIVE panda walked to the NOUN and then VERB. A nearby NOUN was unaffected by these events
'''
# 輸入文件
input_file = open('./input_text.txt')
input_text = input_file.read()
input_file.close()

# 輸出文本
output_text = input_text

# 輸入文本尋找關鍵詞
keywords = re.compile('adjective|noun|verb', re.IGNORECASE)
mo = keywords.findall(input_text)

# 一個一個詞進行替換
for word in mo:
    if word[0].lower() == 'a':
        replacewords = input('Enter an {}:\n'.format(word))
    else:
        replacewords = input('Enter a {}:\n'.format(word))
    regex = re.compile(word)
    # 每一次替換一個詞
    output_text = regex.sub(replacewords, output_text, 1)

# 寫入新文件
output_file = open('output_text.txt', 'w')
output_file.write(output_text)
output_file.close()
print(output_text)

Enter an ADJECTIVE:
silly
Enter a NOUN:
chandelier
Enter a VERB:
screamed
Enter a NOUN:
pickup truck
The silly panda walked to the chandelier and then screamed. A nearby pickup truck was unaffected by these events.

2.3 正則表達式查找

編寫一個程序,打開文件夾中所有的.txt 文件,查找匹配用戶提供的正則表達式的所有行。結果應該打印到屏幕上。


import os
import re

path = "./"

# 判斷路徑目錄是否存在
folder = os.path.exists(path)
if folder == False:
    print("文件目錄不存在!")


#返回指定目錄下所有的文件名和文件夾名列表
file_Name = os.listdir(path)

#創建正則表達式
keywords = re.compile(r'ADJECTIVE')

# 找出txt文件
for i in range(len(file_Name)):
    #判斷是否爲txt文件
    if os.path.isfile(os.path.join(path, file_Name[i])) and file_Name[i].split('.')[-1] == 'txt':
        # 打開文件
        file = open(os.path.join(path, file_Name[i]))
        file_texts = file.readlines()
        for texts in file_texts:
            #找出匹配正則表達式的內容
            text_put = keywords.search(texts)
            #輸出結果
            if text_put != None:
                #打印當前行
                print('{}'.format(texts))
The ADJECTIVE panda walked to the NOUN and then VERB. A nearby NOUN was unaffected by these events.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章