禁止轉載,原文:https://blog.csdn.net/qq_45801887/article/details/139258793
參考教程:B站視頻講解——https://space.bilibili.com/3546616042621301
- 如果代碼存在問題,麻煩大家指正 ~ ~
- 有幫助麻煩點個贊 ~ ~
文件自學引導
- 第1關:讀文件全部內容到一個字符串
- 第2關:讀文件前n個字符
- 第3關:逐行讀取并輸出文件內容
- 第4關:讀取文件到列表中
- 第5關:讀取文件中的數據到二維列表
- 第6關:將唐詩寫入到文件中
第1關:讀文件全部內容到一個字符串
任務描述
本關任務:編寫一個能讀文件全部內容到一個字符串的小程序。
相關知識
為了完成本關任務,你需要掌握:
- 文件的打開
- 讀文件到字符串
文件的打開
內置函數open(file, mode='r', encoding=None)
可以打開 file
并返回對應的文件對象(file object)
。
file
是一個可以帶路徑的文件名,mode
用于指定打開文件的模式。默認值是 'r'
,表示以文本模式打開并讀取文件。其他常見模式有:寫入模式 'w'
(已存在文件會被清空)、獨占創建模式 'x'
、追加寫入模式 'a'
。
encoding
用于在文本模式下指定編碼格式,默認根據當前平臺決定編碼格式。
當使用 open()
以文本模式 ('w'
, 'r'
, 'wt'
, 'rt'
等) 打開文件時,它將返回 io.TextIOBase
的一個子類io.TextIOWrapper
。
file = '/data/bigfiles/靜夜思.txt'
f = open(file, mode='r', encoding='utf-8') # f是為文件對象命名
print(f)
輸出:
<_io.TextIOWrapper name='靜夜思.txt' mode='r' encoding='utf-8'>
建議將open()
函數用上下文管理器容器中,減少遇到異常關閉文件出錯的問題。
file = '/data/bigfiles/靜夜思.txt'
with open(file, mode='r', encoding='utf-8') as f: # 文件對象命名放在as后面print(f) # 操作文件的語句放在縮進的語句塊中,離開縮進就關閉文件
輸出:
<_io.TextIOWrapper name='靜夜思.txt' mode='r' encoding='utf-8'>
讀文件到字符串
read(size
) 無參數或參數為-1
時,讀取全部文件內容;
file = '/data/bigfiles/靜夜思.txt'
with open(file, mode='r', encoding='utf-8') as f: # 為文件對象命的名放在as后面txt = f.read() # 將文件全部內容讀入到字符串txt中
print(txt)
輸出:
靜夜思
李白
床前明月光,疑是地上霜。
舉頭望明月,低頭思故鄉。
編程要求
根據提示,在右側編輯器補充代碼,輸出文件“出塞.txt
”全部字符。文件路徑和文件名為:‘/data/bigfiles/出塞.txt
’
測試說明
平臺會對你編寫的代碼進行測試:
測試輸入:
無
預期輸出:
出塞王昌齡(唐)
秦時明月漢時關,萬里長征人未還。
但使龍城飛將在,不教胡馬度陰山。
提示:
- 每行末有一個換行符“
\n
”
本單元可能用到的文件下載:
出塞.txt
8.1 靜夜思.txt
唐詩三百首 (2022).txt
7.8 唐詩三百首.txt
8.2 score.csv
8.5 score.csv
開始你的任務吧,祝你成功!
參考代碼
# 禁止轉載,原文:https://blog.csdn.net/qq_45801887/article/details/139258793
# 參考教程:B站視頻講解 https://space.bilibili.com/3546616042621301
with open('/data/bigfiles/出塞.txt', mode='r', encoding='utf-8') as f: print(f.read())
第2關:讀文件前n個字符
任務描述
本關任務:編寫一個能讀文件前n個字符的小程序。
相關知識
為了完成本關任務,你需要掌握:
- 讀文件到字符串
讀文件到字符串
2. read(size)
當參數size
為大于或等于0
的整數時,讀取size
個字符。
file = '/data/bigfiles/靜夜思.txt'
with open(file, mode='r', encoding='utf-8') as f: # 為文件對象命的名放在as后面txt = f.read(3) # 將文件前3個字符讀入到字符串txt中
print(txt)
輸出:
靜夜思
編程要求
根據提示,在右側編輯器補充代碼,輸入一個正整數n,輸出“出塞.txt
”前n
個字符。
測試說明
平臺會對你編寫的代碼進行測試:
測試輸入:
3
預期輸出:
靜夜思
測試輸入:
13
預期輸出:
靜夜思
李白
床前明月光,
提示:
- 每行末有一個換行符“
\n
”
開始你的任務吧,祝你成功!
參考代碼
# 禁止轉載,原文:https://blog.csdn.net/qq_45801887/article/details/139258793
# 參考教程:B站視頻講解 https://space.bilibili.com/3546616042621301
with open('/data/bigfiles/出塞.txt', mode='r', encoding='utf-8') as f: print(f.read(int(input())))
第3關:逐行讀取并輸出文件內容
任務描述
本關任務:編寫一個能逐行讀取并輸出文件內容的小程序。
相關知識
為了完成本關任務,你需要掌握:
- 讀文件到字符串
- 文件指針
讀文件到字符串
f.readline()
從文件中讀取單行數據;字符串末尾保留換行符(\n
),空行使用 ‘\n
’ 表示,該字符串只包含一個換行符。
f.readline()
返回空字符串時,表示已經到達了文件末尾。
file = '/data/bigfiles/靜夜思.txt'
with open(file,'r',encoding = 'utf-8') as poem: # 打開文件創建文件對象,命名為poemwhile txt := poem.readline(): # 逐行讀文件,直至文件結束print(txt.strip()) # 去除行末的換行符后輸出當前讀到的字符串
輸出:
靜夜思
李白
床前明月光,疑是地上霜。
舉頭望明月,低頭思故鄉。
f.readline(size)
當參數size
為大于或等于0
的整數時,從指針所在處向后最多讀取當前行的前size
個字符,當前行剩余字符少于size
時,讀取到行末。
編程要求
根據提示,在右側編輯器補充代碼,輸入一個文件名,用readline()
方法逐行讀取并輸出文件內容,輸出時去除每行末的換行符。
測試說明
平臺會對你編寫的代碼進行測試:
測試輸入:
靜夜思.txt
預期輸出:
靜夜思
李白
床前明月光,疑是地上霜。
舉頭望明月,低頭思故鄉。
開始你的任務吧,祝你成功!
參考代碼
# 禁止轉載,原文:https://blog.csdn.net/qq_45801887/article/details/139258793
# 參考教程:B站視頻講解 https://space.bilibili.com/3546616042621301
file = '/data/bigfiles/' + input()
with open(file,'r',encoding = 'utf-8') as f:for line in f.readlines(): print(line.strip())
第4關:讀取文件到列表中
任務描述
本關任務:編寫一個能讀取文件到列表中的小程序。
相關知識
為了完成本關任務,你需要掌握:
- 讀文件到列表
讀文件到列表
readlines()
無參數時,讀取文件全部數據,返回一個列表,列表中每個元素是文件對象中的一行數據,包括行末的換行符’\n
’。
file = '/data/bigfiles/靜夜思.txt'
with open(file, 'r', encoding='utf-8') as poem: # 打開文件創建文件對象,命名為poempoem_ls = poem.readlines() # 讀取文件內容到列表
print(poem_ls)
輸出:
['靜夜思\n', '李白\n', '床前明月光,疑是地上霜。\n', '舉頭望明月,低頭思故鄉。']
readlines(hint)
當參數hint
為大于或等于0
的整數時,返回文件從頭到第hint
個字符所在的行末。
file = '/data/bigfiles/靜夜思.txt'
with open(file, 'r', encoding='utf-8') as poem: # 打開文件創建文件對象,命名為poempoem_ls = poem.readlines(10) # 讀取文件,到第10個字符所在的行末
print(poem_ls)
輸出:
['靜夜思\n', '李白\n', '床前明月光,疑是地上霜。\n']
編程要求
根據提示,在右側編輯器補充代碼,輸入一個文件名,將該文件內容轉為列表輸出。
測試說明
平臺會對你編寫的代碼進行測試:
測試輸入:
靜夜思.txt
預期輸出:
['靜夜思\n', '李白\n', '床前明月光,疑是地上霜。\n', '舉頭望明月,低頭思故鄉。']
提示:
- 每行末有一個換行符“
\n
”
開始你的任務吧,祝你成功!
參考代碼
# 禁止轉載,原文:https://blog.csdn.net/qq_45801887/article/details/139258793
# 參考教程:B站視頻講解 https://space.bilibili.com/3546616042621301
with open(input(), 'r', encoding='utf-8') as f:print(f.readlines())
第5關:讀取文件中的數據到二維列表
任務描述
本關任務:編寫一個能讀取文件中的數據到二維列表的小程序。
相關知識
為了完成本關任務,你需要掌握:
- 字符串切分
- 遍歷文件轉二維列表
字符串切分
txt.split(sep)
根據分隔符sep
對字符串txt
進行切分,返回一個列表。
row = '姓名,C,Java,Python,C#\n'
print(row.strip())
# 去除行末換行符,姓名,C,Java,Python,C#
print(row.strip().split(',')) # 去除換行符后根據逗號切分為列表
# ['姓名', 'C', 'Java', 'Python', 'C#']
遍歷文件
雖然readlines()
方法可以將文件讀取到二維列表中,但其元素仍為字符串。
很多存放數據的文件中每行數據是用逗號或空格分隔的,可以直接切分為列表,再加入到列表中,構成二維列表。
對于這樣的需求,建議使用遍歷文件對象的方法。
file = '../csv/8.2 score.csv'
score_ls = [] # 創建一個空列表
with open(file, 'r', encoding='utf-8') as fr: # 打開文件創建文件對象,命名為poemfor row in fr: # 遍歷文件對象,row為當前行lst = row.strip().split(',') # 當前行切分為一個列表score_ls.append(lst) # 將當前行切分得到的列表附加到score_ls中
print(score_ls) # 輸出二維列表
列表推導式方法:
file = '../csv/8.2 score.csv'
with open(file, 'r', encoding='utf-8') as fr: # 打開文件創建文件對象,命名為poemscore_ls = [row.strip().split(',') for row in fr] # 遍歷文件對象,row為當前行
print(score_ls) # 輸出二維列表
輸出:
[['姓名', 'C', 'Java', 'Python', 'C#'],
['羅明', '95', '96', '85', '63'],
['朱佳', '75', '93', '66', '85'],
['李思', '86', '76', '96', '93'],
['鄭君', '88', '98', '76', '90'],
['王雪', '99', '96', '91', '88']]
編程要求
根據提示,在右側編輯器補充代碼,輸入一個文件名,先讀輸出文件的第一行,再將該文件其他內容轉為列表輸出。
測試說明
平臺會對你編寫的代碼進行測試:
測試輸入:
score.csv
預期輸出:
[['姓名', 'C', 'Java', 'Python', 'C#'], ['羅明', '95', '96', '85', '63'], ['朱佳', '75', '93', '66', '85'], ['李思', '86', '76', '96', '93'], ['鄭君', '88', '98', '76', '90'], ['王雪', '99', '96', '91', '88']]
提示:
- 每行末有一個換行符“
\n
”
開始你的任務吧,祝你成功!
參考代碼
# 禁止轉載,原文:https://blog.csdn.net/qq_45801887/article/details/139258793
# 參考教程:B站視頻講解 https://space.bilibili.com/3546616042621301
with open('/data/bigfiles/'+input(), 'r', encoding='utf-8') as f:ls = [line.strip().split(',') for line in f]print(ls)
第6關:將唐詩寫入到文件中
任務描述
本關任務:編寫一個能將指定序號的唐詩寫入到單獨的文件中的小程序。
相關知識
為了完成本關任務,你需要掌握:
- 文件寫入
文件寫入
f.write(s)
將字符串s
寫入到文件對象f中。
file = '233李白:靜夜思.txt'
poem = '靜夜思\n李白\n床前明月光,疑是地上霜。\n舉頭望明月,低頭思故鄉。\n'
with open(file, 'w', encoding='utf-8') as fw: # 打開文件創建文件對象,命名為poemfw.write(poem)
編程要求
根據提示,在右側編輯器補充代碼,輸入一個3
位數字字符表示的詩的序號,從文件“/data/bigfiles/唐詩三百首.txt
”中讀出指定序號的詩句,再將該詩單獨寫入到以該詩序號開始的行為文件名的文件中。
測試說明
平臺會對你編寫的代碼進行測試:
測試輸入:
237
預期輸出:
創建文件:
237劉長卿:送靈澈.txt
文件內容如下:
237劉長卿:送靈澈蒼蒼竹林寺,杳杳鐘聲晚。
荷笠帶斜陽,青山獨歸遠。
提示:
- 每行末有一個換行符“
\n
”
開始你的任務吧,祝你成功!
參考代碼
# 禁止轉載,原文:https://blog.csdn.net/qq_45801887/article/details/139258793
# 參考教程:B站視頻講解 https://space.bilibili.com/3546616042621301
def get_poem(file):"""讀唐詩300首,定位到用戶輸入的序號的詩,將該首詩讀取為一個字符串,返回去除末尾空白字符的字符串"""poem = '' poet_flag = Falsewith open(file, 'r', encoding='utf-8') as f: for line in f:if line[:3] == str(num):poem = poem + linepoet_flag = Trueelif line[0] in '0123456789': poet_flag = Falseelif poet_flag:poem = poem + linereturn poemdef write_poem(line):"""參數是包含指定序號詩句的字符串,提取詩的標題行做為要寫入的文件名,將全部詩句按順序寫入到文件中,返回詩的標題行"""title = line.split(maxsplit=1)[0]with open(title+'.txt', 'w', encoding='utf-8') as f:f.write(line)return titledef check_file(file):"""參數是新創建的文件名,讀取新創建并寫入詩句的文件,檢查是否寫入成功,無返回值"""with open(file, 'r', encoding='utf-8') as fr:print(fr.read()) # 文件讀取為一個字符串并輸出if __name__ == '__main__':filename = '/data/bigfiles/唐詩三百首.txt' # 源文件路徑num = input() # 輸入序號poem_str = get_poem(filename) # 讀取指定序號的詩為字符串file_title = write_poem(poem_str) # 字符串寫入文件,并返回標題check_file(file_title+'.txt') # 查看寫入的文件,輸出詩的內容