python3.6—將檔案(record.txt)中的資料進行分割並分別儲存(附錄:檔案開啟模式,檔案物件方法以及字串使用及註釋)
阿新 • • 發佈:2019-01-04
分割要求:
1.讀入record.txt檔案中的資料內容
2.將boy的對話單獨儲存到名為“boy_count.txt”的檔案中
3.將girl的對話單獨儲存到名為“girl_count.txt”的檔案中
4.檔案中共有三段對話(最後一段無=分割符),分別儲存為boy_1.txt,girl_1.txt,boy_2.txt,girl_2.txt,boy_3.txt,girl_3.txt共6個檔案(其中,檔案中不同對話間使用“=========”分割)
原始碼如下:
f=open('F://recode.txt') boy=[] girl=[] count=1 for each_line in f: if each_line[:3] !='===': #判斷是否有分隔符 (role,line_spoken)=each_line.split(':',1)#txt文件中的冒號需是英文格式,否則報錯 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_a = 'boy_' + str(count) + '.txt'#由於第3段後無分隔符,所以單獨寫入 file_name_b = 'girl_' + str(count) + '.txt' a_file = open(file_name_a, 'w') b_file = open(file_name_b, 'w') a_file.writelines(boy) b_file.writelines(girl) a_file.close() b_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() f=open('F://recode.txt') boy=[] girl=[] count=1 for each_line in f: if each_line[:3] !='===': (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()
附錄:
檔案開啟模式 | 執行操作 |
'r' | 以只讀方式開啟檔案(預設) |
'w' | 以寫入的方式開啟檔案,會覆蓋已存在的檔案 |
'x' | 如果檔案已經存在,使用此模式開啟將引發異常 |
'a' | 以寫入模式開啟,如果檔案存在,則在末尾追加寫入 |
'b' | 以二進位制模式開啟檔案 |
't' | 以文字模式開啟(預設) |
'+' | 可讀寫模式(可新增到其他模式中使用) |
'U' | 通用換行符支援 |
檔案物件方法 | 執行操作 |
f.close() | 關閉檔案 |
f.read([size]) | 從檔案讀取size個字元,當未給定size或給定負值的時候,讀取剩餘的所有字元,然後作為字串返回 |
f.readline([size]) | 從檔案中讀取並返回一行(包括行結束符),如果有size有定義則返回size個字元 |
f.write(str) | 將字串str寫入檔案 |
f.writelines(seq) | 向檔案寫入字串序列seq,seq應該是一個返回字串的可迭代物件 |
f.seek(offset, from) | 在檔案中移動檔案指標,從from(0代表檔案起始位置,1代表當前位置,2代表檔案末尾)偏移offset個位元組 |
f.tell() | 返回當前在檔案中的位置 |
f.truncate([size=file.tell()]) | 擷取檔案到size個位元組,預設是擷取到檔案指標當前位置 |
字串 | 註釋 |
capitalize() | 把字串的第一個字元改為大寫 |
casefold() | 把整個字串的所有字元改為小寫 |
center(width) | 將字串居中,並使用空格填充至長度 width 的新字串 |
count(sub[, start[, end]]) | 返回 sub 在字串裡邊出現的次數,start 和 end 引數表示範圍,可選。 |
encode(encoding='utf-8', errors='strict') | 以 encoding 指定的編碼格式對字串進行編碼。 |
endswith(sub[, start[,end]]) | 檢查字串是否以 sub 子字串結束,如果是返回 True,否則返回 False。start 和 end 引數表示範圍,可選。 |
expandtabs([tabsize=8]) | 把字串中的 tab 符號(\t)轉換為空格,如不指定引數,預設的空格數是 tabsize=8。 |
find(sub[, start[, end]]) | 檢測 sub 是否包含在字串中,如果有則返回索引值,否則返回 -1,start 和 end 引數表示範圍,可選。 |
index(sub[, start[, end]]) | 跟 find 方法一樣,不過如果 sub 不在 string 中會產生一個異常。 |
isalnum() | 如果字串至少有一個字元並且所有字元都是字母或數字則返回 True,否則返回 False。 |
isalpha() | 如果字串至少有一個字元並且所有字元都是字母則返回 True,否則返回 False。 |
isdecimal() | 如果字串只包含十進位制數字則返回 True,否則返回 False。 |
isdigit() | 如果字串只包含數字則返回 True,否則返回 False。 |
islower() | 如果字串中至少包含一個區分大小寫的字元,並且這些字元都是小寫,則返回 True,否則返回 False。 |
isnumeric() | 如果字串中只包含數字字元,則返回 True,否則返回 False。 |
isspace() | 如果字串中只包含空格,則返回 True,否則返回 False。 |
istitle() | 如果字串是標題化(所有的單詞都是以大寫開始,其餘字母均小寫),則返回 True,否則返回 False。 |
isupper() | 如果字串中至少包含一個區分大小寫的字元,並且這些字元都是大寫,則返回 True,否則返回 False。 |
join(sub) | 以字串作為分隔符,插入到 sub 中所有的字元之間。 |
ljust(width) | 返回一個左對齊的字串,並使用空格填充至長度為 width 的新字串。 |
lower() | 轉換字串中所有大寫字元為小寫。 |
lstrip() | 去掉字串左邊的所有空格 |
partition(sub) | 找到子字串 sub,把字串分成一個 3 元組 (pre_sub, sub, fol_sub),如果字串中不包含 sub 則返回 ('原字串', '', '') |
replace(old, new[,count]) | 把字串中的 old 子字串替換成 new 子字串,如果 count 指定,則替換不超過 count 次。 |
rfind(sub[, start[, end]]) | 類似於 find() 方法,不過是從右邊開始查詢。 |
rindex(sub[, start[, end]]) | 類似於 index() 方法,不過是從右邊開始。 |
rjust(width) | 返回一個右對齊的字串,並使用空格填充至長度為 width 的新字串。 |
rpartition(sub) | 類似於 partition() 方法,不過是從右邊開始查詢。 |
rstrip() | 刪除字串末尾的空格。 |
split(sep=None,maxsplit) | 不帶引數預設是以空格為分隔符切片字串,如果 maxsplit 引數有設定,則僅分隔 maxsplit 個子字串,返回切片後的子字串拼接的列表。 |
splitlines(([keepends])) | 在輸出結果裡是否去掉換行符,預設為 False,不包含換行符;如果為 True,則保留換行符。。 |
startswith(prefix[, start[, end]]) | 檢查字串是否以 prefix 開頭,是則返回 True,否則返回 False。start 和 end 引數可以指定範圍檢查,可選。 |
strip([chars]) | 刪除字串前邊和後邊所有的空格,chars 引數可以定製刪除的字元,可選。 |
swapcase() | 翻轉字串中的大小寫。 |
title() | 返回標題化(所有的單詞都是以大寫開始,其餘字母均小寫)的字串。 |
translate(table) | 根據 table 的規則(可以由 str.maketrans('a', 'b') 定製)轉換字串中的字元。 |
upper() | 轉換字串中的所有小寫字元為大寫。 |
zfill(width) | 返回長度為 width 的字串,原字串右對齊,前邊用 0 填充。 |