第029講:檔案:一個任務
阿新 • • 發佈:2018-11-24
目錄
0. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!
0. 編寫一個程式,接受使用者的輸入並儲存為新的檔案,程式實現如圖:
1. 編寫一個程式,比較使用者輸入的兩個檔案,如果不同,顯示出所有不同處的行號與第一個不同字元的位置,程式實現如圖:
2. 編寫一個程式,當用戶輸入檔名和行數(N)後,將該檔案的前N行內容列印到螢幕上,程式實現如圖:
3. 呃,不得不說我們的使用者變得越來越刁鑽了。要求在上一題的基礎上擴充套件,使用者可以隨意輸入需要顯示的行數。
0. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!
•任務:將檔案(record.txt)中的資料進行分割並按照以下規律儲存起來:
–小甲魚的對話單獨儲存為boy_*.txt的檔案(去掉“小甲魚:”)
–小客服的對話單獨儲存為girl_*.txt的檔案(去掉“小客服:”)
–檔案中總共有三段對話,分別儲存為boy_1.txt, girl_1.txt,boy_2.txt, girl_2.txt, boy_3.txt, gril_3.txt共6個檔案(提示:檔案中不同的對話間已經使用“==========”分割)
小客服:小甲魚,今天有客戶問你有沒有女朋友? 小甲魚:咦?? 小客服:我跟她說你有女朋友了! 小甲魚:。。。。。。 小客服:她讓你分手後考慮下她!然後我說:"您要買個優盤,我就幫您留意下~" 小甲魚:然後呢? 小客服:她買了兩個,說發一個貨就好~ 小甲魚:呃。。。。。。你真牛! 小客服:那是,誰讓我是魚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)