1. 程式人生 > >第029講:檔案:一個任務

第029講:檔案:一個任務

目錄

0. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!

0. 編寫一個程式,接受使用者的輸入並儲存為新的檔案,程式實現如圖:

1. 編寫一個程式,比較使用者輸入的兩個檔案,如果不同,顯示出所有不同處的行號與第一個不同字元的位置,程式實現如圖:

2. 編寫一個程式,當用戶輸入檔名和行數(N)後,將該檔案的前N行內容列印到螢幕上,程式實現如圖:

3. 呃,不得不說我們的使用者變得越來越刁鑽了。要求在上一題的基礎上擴充套件,使用者可以隨意輸入需要顯示的行數。

4. 編寫一個程式,實現“全部替換”功能,程式實現如圖:


0. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!

任務:將檔案(record.txt)中的資料進行分割並按照以下規律儲存起來:

小甲魚的對話單獨儲存為boy_*.txt的檔案(去掉“小甲魚:”)

小客服的對話單獨儲存為girl_*.txt的檔案(去掉“小客服:”)

檔案中總共有三段對話,分別儲存為boy_1.txt, girl_1.txtboy_2.txt, girl_2.txt, boy_3.txt, gril_3.txt6個檔案(提示:檔案中不同的對話間已經使用“==========分割

小客服:小甲魚,今天有客戶問你有沒有女朋友?
小甲魚:咦??
小客服:我跟她說你有女朋友了!
小甲魚:。。。。。。
小客服:她讓你分手後考慮下她!然後我說:"您要買個優盤,我就幫您留意下~"
小甲魚:然後呢?
小客服:她買了兩個,說發一個貨就好~
小甲魚:呃。。。。。。你真牛!
小客服:那是,誰讓我是魚C最可愛小客服嘛~
小甲魚:下次有人想調戲你我不阻止~
小客服:滾!!!
================================================================================
小客服:小甲魚,有個好評很好笑哈。
小甲魚:哦?
小客服:"有了小甲魚,以後媽媽再也不用擔心我的學習了~"
小甲魚:哈哈哈,我看到丫,我還發微博了呢~
小客服:嗯嗯,我看了你的微博丫~
小甲魚:喲西~
小客服:那個有條回覆“左手拿著小甲魚,右手拿著打火機,哪裡不會點哪裡,so easy ^_^”
小甲魚:T_T
================================================================================
小客服:小甲魚,今天一個會員想找你
小甲魚:哦?什麼事?
小客服:他說你一個學生月薪已經超過12k了!!
小甲魚:哪裡的?
小客服:上海的
小甲魚:那正常,哪家公司?
小客服:他沒說呀。
小甲魚:哦
小客服:老大,為什麼我工資那麼低啊??是時候漲漲工資了!!
小甲魚:啊,你說什麼?我在外邊呢,這裡好吵吖。。。。。。
小客服:滾!!!
f = open('record.txt')

boy = []
girl = []
count = 1

for each_line in f:
    if each_line[:6] != '======':
        (role, line_spoken) = each_line.split(':', 1)
        if role == '小甲魚':
            boy.append(line_spoken)
        if role == '小客服':
            girl.append(line_spoken)
    else:
        file_name_boy = 'boy_' + str(count) + '.txt'
        file_name_girl = 'girl_' + str(count) + '.txt'

        boy_file = open(file_name_boy, 'w')
        girl_file = open(file_name_girl, 'w')

        boy_file.writelines(boy)
        girl_file.writelines(girl)

        boy_file.close()
        girl_file.close()

        boy = []
        girl = []
        count += 1

file_name_boy = 'boy_' + str(count) + '.txt'
file_name_girl = 'girl_' + str(count) + '.txt'

boy_file = open(file_name_boy, 'w')
girl_file = open(file_name_girl, 'w')

boy_file.writelines(boy)
girl_file.writelines(girl)

boy_file.close()
girl_file.close()

f.close()

利用函式優化後的程式:

def save_file(boy, girl, count):
    file_name_boy = 'boy_' + str(count) + '.txt'
    file_name_girl = 'girl_' + str(count) + '.txt'

    boy_file = open(file_name_boy, 'w')
    girl_file = open(file_name_girl, 'w')

    boy_file.writelines(boy)
    girl_file.writelines(girl)

    boy_file.close()
    girl_file.close()


def split_file(file_name):
    f = open(file_name)

    boy = []
    girl = []
    count = 1

    for each_line in f:
        if each_line[:6] != '======':
            (role, line_spoken) = each_line.split(':', 1)
            if role == '小甲魚':
                boy.append(line_spoken)
            if role == '小客服':
                girl.append(line_spoken)
        else:
            save_file(boy, girl, count)

            boy = []
            girl = []
            count += 1

    save_file(boy, girl, count)

    f.close()


split_file('record.txt')

0. 編寫一個程式,接受使用者的輸入並儲存為新的檔案,程式實現如圖:

從明天起,做一個幸福的人
餵馬、劈柴、周遊世界
從明天起,關心糧食和蔬菜
我有一所房子,面朝大海,春暖花開

從明天起,和每一個親人通訊
告訴他們我的幸福
那幸福的閃電告訴我的
我將告訴每一個人

給每一條河每一座山取一個溫暖的名字
陌生人,我也為你祝福
願你有一個燦爛的前程
願你有情人終成眷屬
願你在塵世獲得幸福
我只願面朝大海,春暖花開
def file_write(file_name):
    f = open(file_name, 'w')
    print('請輸入內容【單獨輸入\':w\'儲存退出】:')

    while True:
        write_some = input()
        if write_some != ':w':
            f.write('%s\n' % write_some)
        else:
            break

    f.close()

file_name = input('請輸入檔名:')
file_write(file_name)

1. 編寫一個程式,比較使用者輸入的兩個檔案,如果不同,顯示出所有不同處的行號與第一個不同字元的位置,程式實現如圖:

def file_compare(file1, file2):
    f1 = open(file1)
    f2 = open(file2)
    count = 0 # 統計行數
    differ = [] # 統計不一樣的數量

    for line1 in f1:
        line2 = f2.readline()
        count += 1
        if line1 != line2:
            differ.append(count)

    f1.close()
    f2.close()
    return differ

file1 = input('請輸入需要比較的頭一個檔名:')
file2 = input('請輸入需要比較的另一個檔名:')

differ = file_compare(file1, file2)

if len(differ) == 0:
    print('兩個檔案完全一樣!')
else:
    print('兩個檔案共有【%d】處不同:' % len(differ))
    for each in differ:
        print('第 %d 行不一樣' % each)

2. 編寫一個程式,當用戶輸入檔名和行數(N)後,將該檔案的前N行內容列印到螢幕上,程式實現如圖:

def file_view(file_name, line_num):
    print('\n檔案%s的前%s的內容如下:\n' % (file_name, line_num))
    f = open(file_name)
    for i in range(int(line_num)):
        print(f.readline(), end= '')

    f.close()

file_name = input(r'請輸入要開啟的檔案(C:\\test.txt):')
line_num = input('請輸入需要顯示該檔案前幾行:')
file_view(file_name, line_num)

3. 呃,不得不說我們的使用者變得越來越刁鑽了。要求在上一題的基礎上擴充套件,使用者可以隨意輸入需要顯示的行數。

(如輸入13:21列印第13行到第21行,輸入:21列印前21行,輸入21:則列印從第21行開始到檔案結尾所有內容)

def file_view(file_name, line_num):
    if line_num.strip() == ':':
        begin = '1'
        end = '-1'
        
    (begin, end) = line_num.split(':')

    if begin == '':
        begin = '1'
    if end == '':
        end = '-1'

    if begin == '1' and end == '-1':
        prompt = '的全文'
    elif begin == '1':
        prompt = '從開始到%s' % end
    elif end == '-1':
        prompt = '從%s到結束' % begin
    else:
        prompt = '從第%s行到第%s行' % (begin, end)

    print('\n檔案%s%s的內容如下:\n' % (file_name, prompt))

    begin = int(begin) - 1
    end = int(end)
    lines = end - begin

    f = open(file_name)  
    
    for i in range(begin):  # 用於消耗掉begin之前的內容
        f.readline()

    if lines < 0:
        print(f.read())
    else:
        for j in range(lines):
            print(f.readline(), end='')
    
    f.close()

file_name = input(r'請輸入要開啟的檔案(C:\\test.txt):')
line_num = input('請輸入需要顯示的行數【格式如 13:21 或 :21 或 21: 或 : 】:')
file_view(file_name, line_num)

4. 編寫一個程式,實現“全部替換”功能,程式實現如圖:


def file_replace(file_name, rep_word, new_word):
    f_read = open(file_name)

    content = []
    count = 0

    for eachline in f_read:
        if rep_word in eachline:
            count = eachline.count(rep_word) #count感覺應該用這個
            eachline = eachline.replace(rep_word, new_word)
        content.append(eachline)    

    decide = input('\n檔案 %s 中共有%s個【%s】\n您確定要把所有的【%s】替換為【%s】嗎?\n【YES/NO】:' \
                   % (file_name, count, rep_word, rep_word, new_word))

    if decide in ['YES', 'Yes', 'yes']:
        f_write = open(file_name, 'w')
        f_write.writelines(content)
        f_write.close()

    f_read.close()


file_name = input('請輸入檔名:')
rep_word = input('請輸入需要替換的單詞或字元:')
new_word = input('請輸入新的單詞或字元:')
file_replace(file_name, rep_word, new_word)