<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    xylz,imxylz

    關(guān)注后端架構(gòu)、中間件、分布式和并發(fā)編程

       :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      111 隨筆 :: 10 文章 :: 2680 評(píng)論 :: 0 Trackbacks

    File - 基礎(chǔ)文件操作

    學(xué)習(xí)一門(mén)語(yǔ)言,我總是喜歡從文件開(kāi)始。文本文件的讀寫(xiě)操作是我比較在意的基本功能。 在這方面,Java語(yǔ)言功能比較強(qiáng)大,用到的設(shè)計(jì)模式也非常多。只是使用起來(lái)太過(guò)繁瑣。 而Python在這方面表現(xiàn)非常好,簡(jiǎn)潔不失功能,強(qiáng)大不失性能,通俗不失優(yōu)雅,值得稱贊。

    我們從一個(gè)最簡(jiǎn)單的開(kāi)始。

    with open('/etc/resolv.conf') as f:
    print(f.read())

    這里有用到with語(yǔ)法來(lái)關(guān)閉文件句柄。

    open()

    首先來(lái)了解下open()內(nèi)置函數(shù)。

    open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
    Open file and return a corresponding file object. If the file cannot be opened, an OSError is raised.

    open()的參數(shù)眾多,通常需要關(guān)注的是mode/encoding/errors/newline等。

    最佳實(shí)踐

    (1) 讀取文件必須傳入字符編碼encoding 
    (2) 用完的流需要關(guān)閉,推薦使用with操作
    (3) 換行符盡可能的使用UNIX格式(\n),盡管python可以智能轉(zhuǎn)換
    (4) 如果可以的話盡可能的使用utf-8編碼來(lái)處理非ascii字符,不要依賴操作系統(tǒng)的編碼

    小貼士

    多個(gè)文件同時(shí)操作可使用with的語(yǔ)法:

    with open('/etc/hosts','r') as f,open('/tmp/hosts','w') as t:
    //do something

    或者

    with f=open('/etc/hosts'),t=open('/tmp/hosts','w'):
    // do something

    file object

    文件對(duì)象描述的是一種“流”操作,通常支持read()或者write()方法。 這里的文件對(duì)象是一種概念上的“文件對(duì)象”,除了常見(jiàn)的真是的磁盤(pán)文件,還可以是 標(biāo)準(zhǔn)輸入輸出文件(stdin/stdout/stderr),內(nèi)存緩沖區(qū)(StringIO,cStringIO), socket,pipes等。

    這在io模塊中有具體的描述。

    文本操作和二進(jìn)制操作有一些區(qū)別。分別介紹。

    Text I/O

    如果mode中包含t(默認(rèn)),那么返回的流是一個(gè)純文本操作。

    read() 是讀取文本的最簡(jiǎn)單的方法。返回的是字符串形式的結(jié)果(和參數(shù)encoding有關(guān))。

    read(n)
    Read and return at most n characters from the stream as a single str. If n is negative or None, reads until EOF.

    在很多安裝腳本中有:

    readme=open('./README.md').read() 

    類似的用法。這在一個(gè)快速結(jié)束的程序中問(wèn)題不大。在正式的服務(wù)中應(yīng)該隨時(shí)關(guān)閉文件句柄釋放資源。

    小貼士:

    如果已經(jīng)讀取到文件末尾,read()則返回空字符串''。 

    如果要讀取一行,使用readline()方法。

    readline(limit=-1)
    Read until newline or EOF and return a single str. If the stream is already at EOF, an empty string is returned. If limit is specified, at most limit characters will be read.

    讀取一行意味著和行結(jié)束符有關(guān),這個(gè)有點(diǎn)復(fù)雜。

    讀取多行,使用readlines()方法。這將返回一個(gè)字符串列表。readlines()也可以限制最多讀取多少個(gè)字符。

    小貼士:

    readline(limit=-1)和readlines(limit=-1)對(duì)limit的描述不太一致。 
    readline(limit=-1)描述的是讀取一行,最多不超過(guò)limit個(gè)字符(不是字節(jié)),因此有可能結(jié)果不是某一行的結(jié)束。
    readlines(limit=-1)描述的是讀取字符,直到limit個(gè)字符所在的行結(jié)束。也就是返回的結(jié)果一定是某一行的結(jié)束(除非EOF)。

    例如:
    >>> open('/tmp/x1','w').write('Python真是一個(gè)好同學(xué)\n只是限制被割裂成兩個(gè)版本了\n我支持python3.x')
    40
    >>> open('/tmp/x1','r').readline(10)
    'Python真是一個(gè)'
    >>> open('/tmp/x1','r').readlines(10)
    ['Python真是一個(gè)好同學(xué)\n']

    readlines(limit)是一個(gè)難以理解的邏輯。如果可以不要隨便傳輸一個(gè)參數(shù)。參考這里。


    寫(xiě)入文本可使用write(s)方法:

    write(s) Write the string s to the stream and return the number of characters written. 

    寫(xiě)入的是字符串,而不是字節(jié)。如果要寫(xiě)入多行字符串,可以使用writelines(lines)方法。

    小貼士:

    write(s)和writelines(lines)不會(huì)將行結(jié)束符寫(xiě)入文件流。因此需要手動(dòng)寫(xiě)入行結(jié)束符。 

    Binary I/O

    二進(jìn)制流和文本流類似,只是二進(jìn)制流沒(méi)有encoding一說(shuō)。打開(kāi)二進(jìn)制流需要傳入?yún)?shù)mode中包含’b’。

    例如:

    >>> type(open('/etc/hosts','rb').read())
    <class 'bytes'>

    對(duì)比文本流,二進(jìn)制流有一些小的差別:

    • read()返回的值是字節(jié)(bytes)
    • readline()返回的值是字節(jié)(bytes),包括換行符
    • readlines()返回的值是字節(jié)(bytes)列表,包括換行符
    • write()參數(shù)可以是bytes或者bytearray
    • readinto(b)是將內(nèi)容讀取到bytearray b中,返回讀取的字節(jié)數(shù)。

    其它文件操作

    除了read/write方法,文件對(duì)象還有一些其它的內(nèi)置方法:

    • file.close() 關(guān)閉文件
    • file.fileno() 獲取文件描述符(整形值)
    • file.flush() 對(duì)于有緩沖區(qū)的寫(xiě)操作,刷新緩沖區(qū)
    • file.tell() 返回當(dāng)前流的字節(jié)位置
    • file.seek() 移動(dòng)文件流的當(dāng)前位置
    • file.truncate() 截?cái)辔募笮?/li>

    將在I/O介紹更多的知識(shí)。



    ©2009-2014 IMXYLZ |求賢若渴
    posted on 2013-02-24 20:55 imxylz 閱讀(5109) 評(píng)論(0)  編輯  收藏 所屬分類: 技術(shù) 、Python

    ©2009-2014 IMXYLZ
    主站蜘蛛池模板: 无码精品一区二区三区免费视频| 国产亚洲精品美女| 亚洲午夜电影一区二区三区| 99热亚洲色精品国产88| 久久亚洲精品高潮综合色a片| 日韩精品无码永久免费网站| 你是我的城池营垒免费看 | 在线看亚洲十八禁网站| 一区二区三区免费精品视频| 久久久久久AV无码免费网站下载 | 日韩a级毛片免费视频| 亚洲精品黄色视频在线观看免费资源| 亚洲精品无码乱码成人| 亚洲福利电影一区二区?| 亚洲成av人无码亚洲成av人| 大妹子影视剧在线观看全集免费| 最近中文字幕mv免费高清视频8| 午夜毛片不卡免费观看视频| 亚洲精品无码专区2| 久久亚洲精品人成综合网| 亚洲精品无码久久久久秋霞| 国产精品内射视频免费| 免费福利视频导航| 啊v在线免费观看| 亚洲一区二区影院| 国产精品国产亚洲区艳妇糸列短篇| 四虎影视久久久免费| 免费国产黄网站在线观看视频| 好男人看视频免费2019中文| 伊人久久亚洲综合影院| 亚洲高清中文字幕综合网| 春暖花开亚洲性无区一区二区| 在线播放免费人成毛片乱码| 好爽又高潮了毛片免费下载| 亚洲熟女少妇一区二区| 亚洲第一成人在线| 波霸在线精品视频免费观看| 日韩毛片无码永久免费看| 亚洲Av无码精品色午夜| 亚洲成a人无码亚洲成www牛牛| 任你躁在线精品免费|