最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python?RawString與open文件的newline換行符遇坑解決

 更新時間:2022年10月14日 11:37:20   作者:HullQin  
這篇文章主要為大家介紹了Python?RawString與open文件的newline換行符遇坑解決示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

背景

一次工作中,我需要完成某個文件的字符串替換。

需求是這樣的:文件A有個占位符,需要利用Python3,把占位符替換成文件B的內(nèi)容。文件都不大,可以一次性讀到內(nèi)存處理。

我想,這不是簡單的open read replace write就搞定了嘛?

結(jié)果,還真有點麻煩!

思路

  • 全量讀取文件A,保存到變量templace
  • 全量讀取文件B,保存到變量text
  • 利用python的re.sub實現(xiàn)正則替換,保存到新變量result
  • 把變量result內(nèi)容寫入文件A
with open('A', encoding='utf8') as f:
  template = f.read()
with open('B', encoding='utf8') as f:
  text = f.read()
result = re.sub(r'占位標(biāo)識符', text, template, 1)
with open('A', 'w', encoding='utf8') as f:
  f.write(result)

遇到的問題

文件B內(nèi)有換行符,也有字符串\n,按上文的方式處理后,所有的字符串\n都變成了換行符!

舉個例子,template是我是:{}(其中{}就是占位符),text是下面的文本:

哈哈
哈哈\n哈哈

替換后,如下圖所示:

可以看到,當(dāng)我打印re.sub結(jié)果時,所有的\n都變成了換行符,字符串\n消失了!

這的確令人煩躁,本來五分鐘可以搞定,結(jié)果要花多余的時間處理這個問題。如果你學(xué)會了本文,以后都不用再去費腦筋了~

思考過程

一開始遇到這個問題,是在寫入文件后發(fā)現(xiàn)的,所以并沒定位的這么準(zhǔn)確,當(dāng)時跟換行符相關(guān)的,我懷疑了以下方面:

  • 字符串定義沒有使用 Raw String(例如r'xxx'這種方式)。
  • 正則替換出了問題。
  • 寫入文件時,newline參數(shù)導(dǎo)致。

如果我們能把這3個問題全都弄清楚,以后定位就非??炝?!

Raw String

Python中,如果字符串常量的定義前加了個r,就表示 Raw String 原始字符串。

Raw String 特點在于,字符串常量里的\將不具有轉(zhuǎn)義作用,它僅僅代表它自己。

例如,你定義個普通字符串"\n",這個字符串長度其實是1,它只包含了1個換行符,對應(yīng)的 ASCII 是10。

如果你定義了原始字符串"\n",這個字符串長度就是2,它包含了字符\和字符n

如果字符串沒轉(zhuǎn)義字符,那么 Raw String 跟普通 String 完全一致

轉(zhuǎn)義字符有這些:

也就是說r'\haha''\haha'是完全一致的,因為\h不是轉(zhuǎn)義字符,所以這種情況下,沒必要加r。

誤區(qū):注意單個字符的引號問題

有一個令人疑惑的點:理論上講,r'\'應(yīng)該就是'\\',但是當(dāng)你使用r'\'時,Python會報錯。

這是因為Python在編譯時,讀取字符串時,如果字符串以單引號開頭,遇到\'后,不論你是不是Raw String,都會繼續(xù)認(rèn)為是字符串,不會把'當(dāng)作結(jié)束符。估計是一個歷史遺留問題。我們只能接受現(xiàn)實。

如何證明呢?你給字符后面加個空格,發(fā)現(xiàn)它們是相等的:r'\ ''\\ '。但是單獨的字符r'\'就報錯了。

但是這種情況只有r'\'r"\"才會發(fā)生,如果字符串長度為2,是沒問題的,例如r"\\"可以被合法定義。

啟發(fā)

定義字符串時,如果你是這么定義:"哈哈\n哈哈",那么這個字符串長度是5,包含了1個換行符。

如果你是這么定義:r"哈哈\n哈哈",那么這個字符串長度是6,不包含換行符,包含字符\n。

同樣,當(dāng)你寫入文件時,如果是f.write('\n'),就表明寫入了換行符,但如果是f.write(r'\n'),就表明寫入了字符串"\n"。

正則替換的問題

這是導(dǎo)致本文問題的根本原因。使用re.sub時,所有的字符串r"\n"都被當(dāng)作了換行符。

怎么辦呢?

只要我們替換前,把原始文件對應(yīng)的字符串的r"\n"都改為r"\\n",手動多加了一次轉(zhuǎn)義符,那么re.sub時,就不會把r"\n"當(dāng)作一個整體改成換行符了,反而會把r"\\"當(dāng)作一個整體,替換為字符\。這樣r"\n"字符串就保留下來了!當(dāng)然,其它轉(zhuǎn)義字符,也統(tǒng)統(tǒng)保留下來了。這就是正確的解法了。

open 文件的 newline 參數(shù)

with open(filename, 'r', newline=None) as f:
  f.read()

這個主要是因為不同操作系統(tǒng)的換行符不同,所以有了這個參數(shù)。Windows 是 CRLF 即 \r\n,Unix 是 LF 即\n,舊版 Macintosh 是 CR 即\r。

通常情況下,我們不需要加這個參數(shù),Python 會自動為我們做這些事情:

  • 讀取文件時,自動把文本中的各種換行符統(tǒng)一轉(zhuǎn)換為"\n"。
  • 寫入文件時,根據(jù)當(dāng)前的操作系統(tǒng),自動把"\n"轉(zhuǎn)換為對應(yīng)的換行符,通過os.linesep可以查看當(dāng)前操作系統(tǒng)換行符。

當(dāng)然,你也可以主動設(shè)置 newline 參數(shù):

  • 讀取文件時,如果 newline 是空字符串'',則Python不會做任何自動轉(zhuǎn)換,讀到什么就是什么。
  • 讀取文件時,如果 newline 是非空字符串,則Python會把換行符轉(zhuǎn)化為這個非空字符串,例如你可以指定為'\r''\r\n'或其它。
  • 寫入文件時,如果 newline 是空字符串'',則Python不會做任何自動轉(zhuǎn)換,現(xiàn)在換行符是什么,就寫入什么。
  • 寫入文件時,如果 newline 是非空字符串,則Python會把\n轉(zhuǎn)化為這個非空字符串,例如你可以指定為'\r''\r\n'或其它。

注意,newline 參數(shù)只對文本文件有效,如果是二進(jìn)制讀寫,newline 是無用的。

其實,大部分時候我們無需關(guān)注這個 newline 參數(shù)。

以上就是Python RawString與open文件的newline換行符遇坑解決的詳細(xì)內(nèi)容,更多關(guān)于Python RawString open文件 newline換行符的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Pytorch中torch.unsqueeze()與torch.squeeze()函數(shù)詳細(xì)解析

    Pytorch中torch.unsqueeze()與torch.squeeze()函數(shù)詳細(xì)解析

    torch.squeeze()這個函數(shù)主要對數(shù)據(jù)的維度進(jìn)行壓縮,去掉維數(shù)為1的的維度,下面這篇文章主要給大家介紹了關(guān)于Pytorch中torch.unsqueeze()與torch.squeeze()函數(shù)詳細(xì)的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Python中執(zhí)行JavaScript實現(xiàn)數(shù)據(jù)抓取的多種方法

    Python中執(zhí)行JavaScript實現(xiàn)數(shù)據(jù)抓取的多種方法

    JavaScript是一門強大的腳本語言,廣泛應(yīng)用于網(wǎng)頁前端開發(fā)、構(gòu)建交互式用戶界面以及處理各種客戶端端任務(wù),有時可能需要在Python環(huán)境中執(zhí)行JavaScript代碼,本文將介紹多種方法,幫助你在Python中執(zhí)行 JavaScript代碼,并提供詳盡的示例代碼,使你能夠輕松掌握這一技能
    2023-11-11
  • Python+Turtle繪制可愛的可達(dá)鴨

    Python+Turtle繪制可愛的可達(dá)鴨

    一年一度的六一兒童節(jié)又來了,祝大朋友小朋友節(jié)日快樂!本文主要介紹如何運用Python中的turtle庫控制函數(shù)繪制可達(dá)鴨,希望你會喜歡
    2022-05-05
  • Python3中詳解fabfile的編寫

    Python3中詳解fabfile的編寫

    這篇文章給大家分享了Python3中詳解fabfile的編寫的相關(guān)知識點以及重要內(nèi)容,有興趣的朋友跟著學(xué)習(xí)下。
    2018-06-06
  • 用代碼幫你了解Python基礎(chǔ)(1)

    用代碼幫你了解Python基礎(chǔ)(1)

    這篇文章主要用代碼幫你了解Python基礎(chǔ),使用數(shù)據(jù)類型和變量以及字符串和格式化的示例代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • django-crontab 定時執(zhí)行任務(wù)方法的實現(xiàn)

    django-crontab 定時執(zhí)行任務(wù)方法的實現(xiàn)

    這篇文章主要介紹了django-crontab 定時執(zhí)行任務(wù)方法的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • python之openpyxl模塊的安裝和基本用法(excel管理)

    python之openpyxl模塊的安裝和基本用法(excel管理)

    這篇文章主要給大家介紹了關(guān)于python之openpyxl模塊的安裝和基本用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • python實現(xiàn)簡單的學(xué)生成績管理系統(tǒng)

    python實現(xiàn)簡單的學(xué)生成績管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)簡單的學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 使用python將微信image下.dat文件解密為.png的方法

    使用python將微信image下.dat文件解密為.png的方法

    這篇文章主要介紹了使用python將微信image下.dat文件解密為.png的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • OpenCV MediaPipe實現(xiàn)顏值打分功能

    OpenCV MediaPipe實現(xiàn)顏值打分功能

    這篇文章主要介紹了通過OpenCV MediaPipe實現(xiàn)攝像頭實時檢測顏值打分功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定的幫助,感興趣的可以了解一下
    2021-12-12

最新評論

逊克县| 鸡西市| 武宣县| 醴陵市| 深水埗区| 梨树县| 湖南省| 湄潭县| 松潘县| 朔州市| 武川县| 读书| 田林县| 大石桥市| 彰武县| 威信县| 鸡泽县| 新密市| 米林县| 巴彦淖尔市| 南宁市| 湘阴县| 夏河县| 嘉义县| 玉田县| 仁怀市| 田林县| 克山县| 商河县| 文化| 永登县| 于田县| 错那县| 垦利县| 潼关县| 施甸县| 犍为县| 长泰县| 乐东| 嘉鱼县| 麻城市|