iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 25
0
自我挑戰組

Python 學習筆記系列 第 25

Day25 Python 基礎 - 文件操作_V2

修改文件有二種方法,一種是把文件裡的所有資料,都暫時存到記憶體裡,找到要修改的文字,然後再回存至文件裡,就像vim一樣,另一種是rename的方式,也就是建立另一個新的文件,然後修改完原本的文件後,寫入至新文件,那我們就來實做第二種方式

準備好二個文件,一個是foo裡面要有內容,另一個新文件是空的 - foo.bak

foo文件內容如下

柯文哲扮演1位到西門町刺青的Rocker,但因實在太怕痛而刺不下去
而柯文哲還以為是真的要在身上刺青
還說「啊?是真的要刺下去嗎?我還沒跟我老婆報備呢。」

foo.bak文件內容如下


要把『是真的要刺下去嗎』 修改成 『不是真的要刺下去吧』,並寫入至foo.bak那要怎麼做咧?

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

f = open("foo", "r", encoding="utf-8")
f_new = open("foo.bak", "w", encoding="utf-8")

for line in f:
    if "是真的要刺下去嗎" in line:
        line = line.replace("是真的要刺下去嗎", "不是真的要刺下去吧")
        f_new.write(line)
    else:
        f_new.write(line)
f.close()
f_new.close()
  • f = open("foo", "r", encoding="utf-8") 只用讀取模式找到要修改的字符串
  • f_new = open("foo.bak", "w", encoding="utf-8") 用寫入模式,是把上面找到修改後的字符串寫入至新文件裡
  • if "是真的要刺下去嗎" in line: 先找出要修改的字符串
  • replace()來做修改字符串

可以優化成下面代碼

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

f = open("foo.txt", "r", encoding="utf-8")
f_new = open("foo.bak", "w", encoding="utf-8")

for line in f:
    if "是真的要刺下去嗎" in line:
        line = line.replace("是真的要刺下去嗎", "不是真的要刺下去吧")
    f_new.write(line)
f.close()
f_new.close()

觀察一下foo.bak文件內容

柯文哲扮演1位到西門町刺青的Rocker,但因實在太怕痛而刺不下去
而柯文哲還以為是真的要在身上刺青
還說「啊?不是真的要刺下去吧?我還沒跟我老婆報備呢。」

嗯!確實已經修改了,但上面的代碼,還是寫的不夠好,因為是寫死的,那如果我想讓用戶自已輸入想要替換的文字,那要怎麼做呢?

請在Terminal中執行 $python3 sed.py 是真的要刺下去嗎 不是真的要刺下去吧

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import sys

find_sys = sys.argv[1]
replace_sys = sys.argv[2]

f = open("foo.txt", "r", encoding="utf-8")
f_new = open("foo.bak", "w", encoding="utf-8")

for line in f:
    if find_sys in line:
        line = line.replace(find_sys, replace_sys)
    f_new.write(line)
f.close()
f_new.close()

在執行這代碼前,先砍掉foo.bak,確認不存在後,再執行上面的代碼,然後觀察一下是不是真的有替換了

今天是聖誕節,還在參加鐵人賽…暈阿,幸好還有五天,快結束了 Orz


上一篇
Day24 Python 基礎 - 文件操作_V2
下一篇
Day26 Python 基礎 - 文件操作_V2(with語句)
系列文
Python 學習筆記29

尚未有邦友留言

立即登入留言