<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
一次工作中,我需要完成某個檔案的字串替換。
需求是這樣的:檔案A有個預留位置,需要利用Python3,把預留位置替換成檔案B的內容。檔案都不大,可以一次性讀到記憶體處理。
我想,這不是簡單的open
read
replace
write
就搞定了嘛?
結果,還真有點麻煩!
re.sub
實現正則替換,儲存到新變數resultwith open('A', encoding='utf8') as f: template = f.read() with open('B', encoding='utf8') as f: text = f.read() result = re.sub(r'佔位識別符號', text, template, 1) with open('A', 'w', encoding='utf8') as f: f.write(result)
檔案B內有換行符,也有字串n
,按上文的方式處理後,所有的字串n
都變成了換行符!
舉個例子,template是我是:{}
(其中{}
就是預留位置),text是下面的文字:
哈哈 哈哈n哈哈
替換後,如下圖所示:
可以看到,當我列印re.sub
結果時,所有的n
都變成了換行符,字串n
消失了!
這的確令人煩躁,本來五分鐘可以搞定,結果要花多餘的時間處理這個問題。如果你學會了本文,以後都不用再去費腦筋了~
一開始遇到這個問題,是在寫入檔案後發現的,所以並沒定位的這麼準確,當時跟換行符相關的,我懷疑了以下方面:
r'xxx'
這種方式)。newline
引數導致。如果我們能把這3個問題全都弄清楚,以後定位就非常快了!
Python中,如果字串常數的定義前加了個r
,就表示 Raw String 原始字串。
Raw String 特點在於,字串常數裡的將不具有跳脫作用,它僅僅代表它自己。
例如,你定義個普通字串"n"
,這個字串長度其實是1,它只包含了1個換行符,對應的 ASCII 是10。
如果你定義了原始字串"n"
,這個字串長度就是2,它包含了字元和字元
n
。
跳脫字元有這些:
也就是說r'haha'
跟'haha'
是完全一致的,因為h
不是跳脫字元,所以這種情況下,沒必要加r
。
有一個令人疑惑的點:理論上講,r''
應該就是'\'
,但是當你使用r''
時,Python會報錯。
這是因為Python在編譯時,讀取字串時,如果字串以單引號開頭,遇到'
後,不論你是不是Raw String,都會繼續認為是字串,不會把'
當作結束符。估計是一個歷史遺留問題。我們只能接受現實。
如何證明呢?你給字元后面加個空格,發現它們是相等的:r' '
和'\ '
。但是單獨的字元r''
就報錯了。
但是這種情況只有r''
或r""
才會發生,如果字串長度為2,是沒問題的,例如r"\"
可以被合法定義。
定義字串時,如果你是這麼定義:"哈哈n哈哈"
,那麼這個字串長度是5,包含了1個換行符。
如果你是這麼定義:r"哈哈n哈哈"
,那麼這個字串長度是6,不包含換行符,包含字元和
n
。
同樣,當你寫入檔案時,如果是f.write('n')
,就表明寫入了換行符,但如果是f.write(r'n')
,就表明寫入了字串"n"
。
這是導致本文問題的根本原因。使用re.sub
時,所有的字串r"n"
都被當作了換行符。
怎麼辦呢?
只要我們替換前,把原始檔案對應的字串的r"n"
都改為r"\n"
,手動多加了一次跳脫符,那麼re.sub
時,就不會把r"n"
當作一個整體改成換行符了,反而會把r"\"
當作一個整體,替換為字元。這樣
r"n"
字串就保留下來了!當然,其它跳脫字元,也統統保留下來了。這就是正確的解法了。
with open(filename, 'r', newline=None) as f: f.read()
這個主要是因為不同作業系統的換行符不同,所以有了這個引數。Windows 是 CRLF 即 rn
,Unix 是 LF 即n
,舊版 Macintosh 是 CR 即r
。
通常情況下,我們不需要加這個引數,Python 會自動為我們做這些事情:
"n"
。"n"
轉換為對應的換行符,通過os.linesep
可以檢視當前作業系統換行符。當然,你也可以主動設定 newline 引數:
''
,則Python不會做任何自動轉換,讀到什麼就是什麼。'r'
或'rn'
或其它。''
,則Python不會做任何自動轉換,現在換行符是什麼,就寫入什麼。n
轉化為這個非空字串,例如你可以指定為'r'
或'rn'
或其它。注意,newline
引數只對文字檔案有效,如果是二進位制讀寫,newline
是無用的。
其實,大部分時候我們無需關注這個 newline
引數。
以上就是Python RawString與open檔案的newline換行符遇坑解決的詳細內容,更多關於Python RawString open檔案 newline換行符的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45