1. 程式人生 > >python3.6—將檔案(record.txt)中的資料進行分割並分別儲存(附錄:檔案開啟模式,檔案物件方法以及字串使用及註釋)

python3.6—將檔案(record.txt)中的資料進行分割並分別儲存(附錄:檔案開啟模式,檔案物件方法以及字串使用及註釋)

分割要求:

        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 填充。