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

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

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

    xylz,imxylz

    關注后端架構、中間件、分布式和并發編程

       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      111 隨筆 :: 10 文章 :: 2680 評論 :: 0 Trackbacks

    File - 基礎文件操作

    學習一門語言,我總是喜歡從文件開始。文本文件的讀寫操作是我比較在意的基本功能。 在這方面,Java語言功能比較強大,用到的設計模式也非常多。只是使用起來太過繁瑣。 而Python在這方面表現非常好,簡潔不失功能,強大不失性能,通俗不失優雅,值得稱贊。

    我們從一個最簡單的開始。

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

    這里有用到with語法來關閉文件句柄。

    open()

    首先來了解下open()內置函數。

    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()的參數眾多,通常需要關注的是mode/encoding/errors/newline等。

    最佳實踐

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

    小貼士

    多個文件同時操作可使用with的語法:

    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

    文件對象描述的是一種“流”操作,通常支持read()或者write()方法。 這里的文件對象是一種概念上的“文件對象”,除了常見的真是的磁盤文件,還可以是 標準輸入輸出文件(stdin/stdout/stderr),內存緩沖區(StringIO,cStringIO), socket,pipes等。

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

    文本操作和二進制操作有一些區別。分別介紹。

    Text I/O

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

    read() 是讀取文本的最簡單的方法。返回的是字符串形式的結果(和參數encoding有關)。

    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() 

    類似的用法。這在一個快速結束的程序中問題不大。在正式的服務中應該隨時關閉文件句柄釋放資源。

    小貼士:

    如果已經讀取到文件末尾,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.

    讀取一行意味著和行結束符有關,這個有點復雜。

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

    小貼士:

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

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

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


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

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

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

    小貼士:

    write(s)和writelines(lines)不會將行結束符寫入文件流。因此需要手動寫入行結束符。 

    Binary I/O

    二進制流和文本流類似,只是二進制流沒有encoding一說。打開二進制流需要傳入參數mode中包含’b’。

    例如:

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

    對比文本流,二進制流有一些小的差別:

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

    其它文件操作

    除了read/write方法,文件對象還有一些其它的內置方法:

    • file.close() 關閉文件
    • file.fileno() 獲取文件描述符(整形值)
    • file.flush() 對于有緩沖區的寫操作,刷新緩沖區
    • file.tell() 返回當前流的字節位置
    • file.seek() 移動文件流的當前位置
    • file.truncate() 截斷文件大小

    將在I/O介紹更多的知識。



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

    ©2009-2014 IMXYLZ
    主站蜘蛛池模板: 18禁无遮挡无码国产免费网站| 国产午夜亚洲精品不卡免下载| 免费观看一区二区三区| 成人永久福利免费观看| 亚洲中文字幕无码mv| 午夜无遮挡羞羞漫画免费| 亚洲色无码国产精品网站可下载| 国产妇乱子伦视频免费| 亚洲国产成a人v在线| 好男人看视频免费2019中文| 亚洲国产精品一区二区三区在线观看| 波多野结衣中文字幕免费视频| 亚洲成a人片在线观看精品| 性感美女视频免费网站午夜| 亚洲AV性色在线观看| 亚洲成AV人网址| 国产免费网站看v片在线| 亚洲精品中文字幕无码AV| 在线观看H网址免费入口| 日韩国产精品亚洲а∨天堂免| 亚洲?V乱码久久精品蜜桃 | 日本视频免费在线| a色毛片免费视频| 久久青青草原亚洲av无码app | 亚洲成a人无码亚洲成av无码 | 秋霞人成在线观看免费视频| 亚洲国产精品成人精品软件| 国产福利免费在线观看| 两性色午夜视频免费网| 亚洲国产精品久久丫| 无码专区一va亚洲v专区在线| 中文字幕在线免费看线人| 久久久久se色偷偷亚洲精品av | 国产黄在线观看免费观看不卡| 亚洲va久久久噜噜噜久久天堂| 女人被免费视频网站| 日本免费一区二区久久人人澡| 亚洲一区在线观看视频| 久久精品国产精品亚洲色婷婷 | 久久激情亚洲精品无码?V| 成年女人免费视频播放体验区 |