Python学习(六)

读写文件

  • 常规写法

      f = None
      try:
          # 标示符'r'表示读
          f = open("./mysql.java", "r")
          # 一次性读取文件全部
          print(f.read())
      finally:
          if f:
              f.close()
    
  • 简洁写法

      with open("./mysql.java", "r") as i:
      # print(i.read())
      # 如果不能确定文件大小,防止内存被爆,可反复调用read(size)方法,每次最多读取size个字节的内容
      # print(i.read(6))
      # 读取一行  readline()
      # print(i.readline())
      # 调用readlines()一次读取所有内容并按行返回list,读取配置文件最方便
      lines = i.readlines()
      print(lines)
      for line in lines:
          # 把末尾的'\n'删掉    strip用来删除首尾的空格
          print(line.strip())
    
  • 读二进制文件

    • 读取二进制文件,比如图片、视频,用'rb'模式打开文件即可

        with open("./down.jpg", "rb") as t:
            print(t.read())         # b'\xff\xd8\xff\xe0\... 十六进制表示的字节
      
    • open函数还可传入encoding参数,用来指定按什么编码来打开文件;open函数还可传入errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略

        with open("./gbk.txt", "r", encoding="gbk", errors="ignore") as g:
            print(g.read())
      
    • 写文件

        with open("./write.txt", "w") as w:
            w.write("Hello Python")
      

StringIO和BytesIO

StringIO在内存中读写str;BytesIO在内存中读写bytes

from io import StringIO, BytesIO

f = StringIO()
# 把str写入StringIO
r = f.write("Hello")
f.write(" ")
f.write("World!")
# 获取写入后的值
print(f.getvalue())     # Hello World!

s = StringIO("Hello\nPython")
while True:
    line = s.readline()
    if line == "":
        break
    print(line.strip())         # Hello   \n   Python

# 在内存中读写bytes
b = BytesIO()
# 将bytes写入BytesIO中
b.write("中文".encode("utf-8"))
print(b.getvalue())             # b'\xe4\xb8\xad\xe6\x96\x87'

# 读取BytesIO中的bytes
b2 = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
print(b2.read())                # b'\xe4\xb8\xad\xe6\x96\x87'

操作文件和目录

import os

# 操作系统类型
print(os.name)
# 获取详细的系统信息
print(os.uname())
# 获取操作系统中定义的环境变量
print(os.environ)
# 查看当前目录的绝对路径
print(os.path.abspath("."))     # /Users/BlainPeng/Desktop/1/Python
# 通过join函数把把整个要创建的新目录的地址拼接出来
# os.path.join("../", "testDir")
# 然后创建这个目录
# os.mkdir("../testDir")
# 删除这个目录
# os.rmdir("../testDir")
# 拆分路径
print(os.path.split(os.path.abspath(".") + "/s1.py"))       # ('/Users/BlainPeng/Desktop/1/Python', 's1.py')
# 获取文件扩展名
print(os.path.splitext(os.path.abspath(".") + "/s1.py"))        # ('/Users/BlainPeng/Desktop/1/Python/s1', '.py')
# 给文件重新命名
# os.rename("test.txt", "test.py")
# 删掉文件
# os.remove("test.java")
# 列出当前目录下的所有目录
print(list(x for x in os.listdir(".") if os.path.isdir(x)))     # ['.idea', 'q1']
# 列出当前目录下所有的.py文件
print(list(x for x in os.listdir(".") if os.path.isfile(x) and os.path.splitext(x)[1] == ".py"))            # ['1.py', '2.py', '3.py', '4.py', '5.py', '6.py']

序列化(pickling)与反序列化(unpickling)

把变量从内存中变成可存储或传输的过程叫做序列化;反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化

import pickle

d = dict(name="Tom", age=18, score=90)
print(d)        # {'score': 90, 'name': 'Tom', 'age': 18}
# 把任意对象序列化成一个bytes,接着就可以把这个bytes写入文件了
res = pickle.dumps(d)
print(res)  # b'\x80\x03}q\x00(X\x05\x00\x00\x00scoreq...
# 将一个bytes反序列化成对象
src = pickle.loads(res)
print(src)  # {'score': 90, 'name': 'Tom', 'age': 18}
# 把对象序列化后直接写入一个file-like object
f = open("dump.java", "wb")
pickle.dump(d, f)
f.close()
# 从一个file-like Object中直接反序列化出对象
r = open("dump.java", "rb")
print(pickle.load(r))   # {'score': 90, 'name': 'Tom', 'age': 18}
r.close()

此种序列化与反序列化只能用于Python,对于其它语言并不能兼容

Json

如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输

import json

d2 = dict(姓名="Jim", 年龄=18, 分数=95)
# Python对象转化为JSON
res2 = json.dumps(d2, ensure_ascii=False)
print(res2)                 # {"分数": 95, "姓名": "Jim", "年龄": 18}
# 把JSON反序列化为Python对象
src2 = json.loads(res2)
print(type(src2))           # <class 'dict'>
print(src2)                 # {'分数': 95, '姓名': 'Jim', '年龄': 18}

with open("dump.json", "w", encoding="utf-8") as w:
    # 直接把JSON写入一个file-like Object
    json.dump(d2, w, ensure_ascii=False)

with open("dump.json", "r", encoding="utf-8") as r:
    # 直接从file-like Object中读取字符串并反序列化
    print(json.load(r))     # {'分数': 95, '姓名': 'Jim', '年龄': 18}
任意类转Json
class Student(object):
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
       self.score = score


def student2dict(std):
    return {
        "name": std.name,
        "age": std.age,
        "score": std.score
    }


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


s = Student("吉姆", 18, 50)
# 把任意一个类对象序列化成Json
# 可选参数default就是把任意一个对象变成一个可序列为JSON的对象,需要自己写转换函数
res = json.dumps(s, ensure_ascii=False, default=student2dict)
print(res)              # {"name": "吉姆", "age": 18, "score": 50}
# 简单写法: 把任意类的实例变为dict
# 通常class的实例都有一个__dict__属性,它就是一个dict,用来存储实例变量。也有少数例外,比如定义了__slots__的class
print(json.dumps(s, ensure_ascii=False, default=lambda obj: obj.__dict__))  # {"score": 50, "name": "吉姆", "age": 18}

# 把Json转化成类对象
json_str = r'{"name": "Mary","age": 18,"score": 95}'
print(json.loads(json_str, object_hook=dict2student))   # <__main__.Student object at 0x101a95668>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容