1. 程式人生 > >小甲魚《零基礎學習Python》課後筆記(二十九):檔案——一個任務

小甲魚《零基礎學習Python》課後筆記(二十九):檔案——一個任務

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

程式碼如下:

f_name = input('請輸入檔名:')  
f = open(f_name, 'wt')  
print("請輸入內容【單獨輸入':w'儲存退出】:")  
str1 = input()  
while str1 != ':w':  
	 f.write('%s\n' % str1)  
	 str1 = input()  
f.close()  

演示程式碼:

>>>   
================== RESTART: I:\Python\小甲魚\test003\test0.
py ================== 請輸入檔名:something.txt 請輸入內容【單獨輸入':w'儲存退出】: 從明天起,做一個幸福的人 餵馬、劈柴,周遊世界 從明天起,關心糧食和蔬菜 我有一所房子,面朝大海,春暖花開 :w
1.編寫一個程式,比較使用者輸入的兩個檔案,如果不同,顯示所有不同處的行號與第一個不同字元的位置,程式實現如圖:


程式碼如下:

list1 = []
diff_count = 0
count = 0
file1_line_count = 0
file2_line_count = 0
f_name1 = input('請輸入需要比較的頭一個檔名:'
) f_name2 = input('請輸入需要比較的另一個檔名:') file1 = open(f_name1, 'rt') file2 = open(f_name2, 'rt') for file1_line in file1: file1_line_count += 1 for file2_line in file2: file2_line_count += 1 file1.seek(0,0) file2.seek(0,0) if file1_line_count > file2_line_count: for file1_line in file1: count += 1 file2_line =
file2.readline() if file1_line != file2_line: diff_count += 1 list1.append(count) else: for file2_line in file2: count += 1 file1_line = file1.readline() if file2_line != file1_line: diff_count += 1 list1.append(count) if diff_count == 0: print('兩個檔案完全相同') else: print('兩個檔案共有【%d】處不同:' %diff_count) for each in list1: print('第%d行不一樣' %each)

測試結果如下,相對原來的程式碼,主要是解決了如果檔案一和檔案二前幾行一致,而後幾行不一致,而且檔案二比檔案一長,如下

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


檔案二(something.txt):
從明天起,做一個幸福的人
餵馬、劈柴,周遊世界
從明天起,關心糧食和蔬菜
我有一所房子,面朝小海,春暖花開
你是


注:此處something.txt是經過第4題的修改的,是“面朝小海”
原始程式會認為兩個檔案一樣,修改後測試結果如下:

================== RESTART: I:\Python\小甲魚\test003\test0.py ==================
請輸入需要比較的頭一個檔名:我.txt
請輸入需要比較的另一個檔名:something.txt
兩個檔案共有【4】處不同:
第4行不一樣
第5行不一樣
第6行不一樣
第7行不一樣

================== RESTART: I:\Python\小甲魚\test003\test0.py ==================
請輸入需要比較的頭一個檔名:something.txt
請輸入需要比較的另一個檔名:我.txt
兩個檔案共有【4】處不同:
第4行不一樣
第5行不一樣
第6行不一樣
第7行不一樣
2.編寫一個程式,當用戶輸入檔名和行數(N)後,將該檔案的前N行中內容列印到螢幕上,程式實現如圖:


程式碼如下:

input_showlines_flag = 1	#顯示行數是否超過檔案行數標誌位
file_lines_count = 0
file_name = input('請輸入要開啟的檔案(C:\\test.txt):')
file = open(file_name, 'rt')
show_lines_count = int(input('請輸入需要顯示該檔案前幾行:'))
for each_line in file:
	file_lines_count += 1
while input_showlines_flag:
	if show_lines_count > file_lines_count:
		print('檔案只有%d行' % (file_lines_count))
		show_lines_count = int(input('請重新輸入行數:'))
	else:
		file.seek(0,0)	#由於for each_line in file時函式指標已指到最後一位,所以要指回首位
		print('檔案%s的前%d行的內容如下:' % (file_name, show_lines_count))
		print()
		while show_lines_count:
			show_lines = file.readline()
			print(show_lines)
			show_lines_count -= 1
		break

print('===================================================')

演示效果:

>>>   
================== RESTART: I:\Python\小甲魚\test003\test0.py ==================  
請輸入要開啟的檔案(C:\test.txt):something.txt  
請輸入需要顯示該檔案前幾行:6  
檔案只有4行  
請重新輸入行數:6  
檔案只有4行  
請重新輸入行數:6  
檔案只有4行  
請重新輸入行數:3  
檔案something.txt的前3行的內容如下:  
	  
從明天起,做一個幸福的人  
	  
餵馬、劈柴,周遊世界  
	  
從明天起,關心糧食和蔬菜  
  
===================================================  

3.呃,不得不說我們的使用者越來越來刁鑽了。要求在上一題的基礎上擴充套件,使用者可以隨意輸入需要顯示的行數。(如輸入13:21列印13行到21行,輸入:21列印前21行,輸入21:就列印從21行開始到檔案結尾左右內容)



程式碼如下:

file_lines_count = 0
file_name = input('請輸入要開啟的檔案(C:\\test.txt):')
file = open(file_name, 'rt')
show_lines_count = input('請輸入需要顯示該檔案的行數【格式如 13:21 或 :21 或 21:】:')
if show_lines_count.strip() == ':':
	begin = 1
	end = -1

(begin, end) = show_lines_count.split(':')

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

begin = int(begin)
end = int(end)

if begin == 1 and end == -1:
	print('檔案%s的全文的內容如下:' % file_name)
	for each_line in file:
		print(each_line, end = '')
elif begin == 1 and end != -1:
	print('檔案%s從開始到第%d行的內容如下:' % (file_name, end))
	while end:
		show_lines = file.readline()
		print(show_lines, end = '')
		end -= 1
elif begin != 1 and end == -1:
	print('檔案%s從第%d行到結尾的內容如下:' % (file_name, begin))
	while begin:
		not_show_lines = file.readline()
		begin -= 1
	show_lines = file.read()
	print(show_lines, end = '')
else:
	print('檔案%s從第%d行到第%d行的內容如下:' % (file_name, begin, end))
	while begin:
		not_show_lines = file.readline()
		begin -= 1
	for x in range(end - begin + 1):
		show_lines = file.readline()
		print(show_lines, end = '')

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


程式碼如下:

list1 = []
old_words_number = 0
file_name = input('請輸入檔名:')
file = open(file_name, 'rt')
old_words = input('請輸入需要替換的單詞或字元:')
new_words = input('請輸入新的單詞或字元:')

for each_line in file:
	if old_words in each_line:
		old_words_number = each_line.count(old_words)
		each_line = each_line.replace(old_words, new_words)
	list1.append(each_line)


print('檔案%s中共有%d個【%s】' % (file_name, old_words_number, old_words))
print('您確定要把所有的【%s】替換為【%s】嗎?' % (old_words, new_words))
flag = input('【YES/NO】:')
if flag.upper() == 'YES':
	file_write = open(file_name, 'wt')
	file_write.writelines(list1)
	file_write.close()
else:
	print('檔案%s未更改!' % file_name)

file.close()

演示效果:

================== RESTART: I:\Python\小甲魚\test003\test0.py ==================  
請輸入檔名:something.txt  
請輸入需要替換的單詞或字元:大  
請輸入新的單詞或字元:小  
檔案something.txt中共有1個【大】  
您確定要把所有的【大】替換為【小】嗎?  
【YES/NO】:yes 

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

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