Python學習記錄之:IO編程

IO編程

文件讀寫

Python中文件讀寫語法和C兼容

  • 讀文件
    使用Python內置的open()函數,傳入文件名和標示符:
f = open('/Users/michael/test.txt', 'r')  # 'r' 表示讀,文件不存在會拋出IOError
print f.read()  # 讀出文件中的全部內容
f.close()  # 關閉文件,文件打開后必須關閉

由于使用try來捕獲不可預料的IOError并在finally中關閉文件比較繁瑣,使用with來簡化:

with open("file_test.py", 'r') as f:
    print f.read()  # 一次讀取全部文件,適用于小文件
    print f.read(10)  # 一次讀取10字節
    print f.readline()  # 一次讀取一行,讀配置文件方便
    print f.readlines()  # 一次讀取全部行并返回按行排列(末尾有'\n')的list
  • file-like Object
    read()方法的對象

  • 二進制文件
    'rb'模式打開

  • 字符編碼
    可以先用'rb'模式打開后再用特定編碼解碼:

with open("file_test.py", 'rb') as f:  # 二進制模式打開文件
    print f.read(10)
    print f.readline().decode('gbk')  # 用GBK編碼解碼

或者直接用某種編碼打開:

import codecs
with codecs.open("file_test.py", 'r', 'gbk'):
    print f.readline()
  • 寫文件
    打開文件時使用'w''wb'方式,使用write()來寫入文件,但文件不一定會立馬寫入磁盤,只有當flush()close()調用的時候才會確定寫入
  • 打開模式
  r     以讀方式打開
  w     以寫方式打開,打開時會清空文件
  a     以追加模式打開 (從 EOF 開始, 必要時創建新文件)
  +     以讀寫模式打開
  b     以二進制模式打開
  t     以文本方式打開

模式可組合使用

操作文件和目錄

  • 系統信息及環境變量
  import os

  print os.name
  # print os.uname()  # win下沒有這個函數
  print os.environ  # 打印環境變量
  print os.getenv('path')  # 獲取某個環境變量的值
  • 操作文件和目錄
  import os

  import shutil

  print os.name
  # print os.uname()  # win下沒有這個函數
  print os.environ  # 打印環境變量
  print os.getenv('path')  # 獲取某個環境變量的值

  abspath = os.path.abspath('.')  # 查看當前目錄的絕對路徑,abspath()尋找當前路徑下的文件的絕對路徑
  print abspath
  join = os.path.join('.', 'testdir')  # 把兩個路徑合成一個, 可以正確處理不同操作系統的路徑分隔符
  print join
  os.mkdir(join)  # 創建目錄
  os.rmdir(join)  # 刪除目錄
  print os.path.split(join)  # 把一個路徑拆分為兩部分,后一部分總是最后級別的目錄或文件名

  os.rename('file_test.txt', 'filetest.txt')  # 對文件重命名
  os.remove('filetest.txt')  # 刪掉文件
  shutil.copyfile('file_test.txt', 'filetest.txt')  # 復制文件

  print [x for x in os.listdir('.') if os.path.isdir(x)]   # 列出當前目錄下的所有目錄
  print [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1] == '.py']  # 列出所有的.py文件

Python的os模塊封裝了操作系統的目錄和文件操作,要注意這些函數有的在os模塊中,有的在os.path模塊中

序列化

我們把變量從內存中變成可存儲或傳輸的過程稱之為序列化,在Python中叫pickling,在其他語言中也被稱之為serialization,marshalling,flattening等等

# coding=utf-8
try:
    import cPickle as pickle
except ImportError:
    import pickle

d = dict(name='Bob', age=20, score=88)
print pickle.dumps(d)  # 序列化為字符串

f = open('dump.txt', 'ab+')
pickle.dump(d, f)  # 序列化并保存到文件
f.close()

f = open('dump.txt')
d = pickle.load(f)  # 從file-like Object對象反序列化
f.close()
print d
  • Json
  # coding=utf-8
  import json
  
  d = dict(name='Bob', age=20, score=88)
  json_str = json.dumps(d)
  print json_str

  json_object = json.loads(json_str)
  print json_object
  print json_object['name']

  class Student(object):
      # __slots__ = ('name', 'age', 'score')  # 沒有定義__slots__時對象內部默認使用dict來保存屬性

      def __init__(self, name, age, score):
          self.name = name
          self.age = age
          self.score = score

  def student2dict(student):
      return {
          'name': student.name,
          'age': student.age,
          'score': student.score
      }

  def dict2student(d):
      return Student(d['name'], d['age'], d['score'])

  s = Student('Bob', 20, 88)
  # print json.dumps(s, default=student2dict)  # 使用序列化函數
  json_str = json.dumps(s, default=lambda obj: obj.__dict__)  # 沒有定義__slots__時對象內部默認使用dict來保存屬性,有__slots__的類無法使用這個特性
  print json_str
  json_object = json.loads(json_str, object_hook=dict2student)
  print json_object

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容