1. f = open('test.txt', 'r') # 'r' 表示只读
  2. s = f.read() # 调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示
  3. print(s)
  4. f.close()
  5. # 由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:
  6. try:
  7. f = open('test.txt','r')
  8. print(f.read())
  9. finally:
  10. if f:
  11. f.close()
  12. # 但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:
  13. with open('test.txt','r') as f:
  14. print(f.read())
  15. # 这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。
  16. # 调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,
  17. # 所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。
  18. # 也可以 用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。
  19. # 如果文件很小,read()一次性读取最方便;
  20. # 如果不能确定文件大小,反复调用read(size)比较保险;
  21. # 如果是配置文件,调用readlines()最方便
  22. f = open('test.txt', 'r')
  23. for line in f.readlines():
  24. print(line.strip())
  25. # file-like Object
  26. # 动态语言没有严格的继承体系限制,只要“act like a duck” 那么就是一只鸭子。
  27. # open 函数返回的是 有 read() 方法的对象。除了file外,还可以是内存的字节流,网络流,自定义流等等。file-like Object不要求从特定类继承,只要写个read()方法就行。
  28. # 二进制文件
  29. f = open('laopo.jpg', 'rb') # 用'rb'模式打开二进制文件
  30. # print(f.read())
  31. # 字符编码
  32. # 要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:
  33. # f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
  34. # 遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:
  35. # f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
  36. # 写文件
  37. # 参数改为 w 或 wb 表示写普通文件或二进制文件
  38. # a 表示在文件末尾追加
  39. # 具体模式定义参见文档:https://docs.python.org/3/library/functions.html#open
  40. f = open('text.txt', 'w')
  41. f.write('Hello, world!')
  42. # 小结:在Python中,文件读写是通过open()函数打开的文件对象完成的。使用with语句操作文件IO是个好习惯。
  43. ############################################################
  44. # StingIO
  45. # 就是在内存中创建的临时 file-like Object,常常用作临时缓冲
  46. from io import StringIO
  47. f = StringIO()
  48. f.write('hello')
  49. f.write(' ')
  50. f.write('world!')
  51. print(f.getvalue())
  52. # BytesIO
  53. # 如果要操作二进制数据,就需要使用BytesIO。
  54. from io import BytesIO
  55. f = BytesIO()
  56. f.write('中文'.encode('utf-8'))
  57. print(f.getvalue())
  58. # StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口。
  59. ############################################################
  60. # 操作文件和目录
  61. # Python内置的os模块也可以直接调用操作系统提供的接口函数。
  62. import os
  63. print(os.name) # 如果是posix,说明系统是Linux、Unix或Mac OS X,如果是nt,就是Windows系统。
  64. # os模块的某些函数是跟操作系统相关的。
  65. # 环境变量
  66. # print(os.environ)
  67. # 要获取某个环境变量的值,可以调用os.environ.get('key')
  68. # print(os.environ.get('PATH'))
  69. # 操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中,这一点要注意一下。
  70. # 查看、创建和删除目录可以这么调用:
  71. # 查看当前绝对路径
  72. p = os.path.abspath('.')
  73. print(p)
  74. # 在某个目录下面创建一个新目录
  75. os.mkdir("E://bb")
  76. os.rmdir("E://bb")
  77. '''
  78. 把两个路径合成一个时,不要直接拼字符串,而要通过os.path.join()函数,这样可以正确处理不同操作系统的路径分隔符。在Linux/Unix/Mac下,os.path.join()返回这样的字符串:
  79. part-1/part-2
  80. 而Windows下会返回这样的字符串:
  81. part-1\part-2
  82. '''
  83. print(os.path.join(r'\Users\michael', 'testdir'))
  84. # 同样的道理,要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()函数,这样可以把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名:
  85. p = os.path.split(r'C:\Users\michael\testdir\file.txt')
  86. print(p)
  87. # os.path.splitext()可以直接让你得到文件扩展名,很多时候非常方便:
  88. p = os.path.splitext(r'C:\Users\michael\testdir\file.txt')
  89. print(p)
  90. # 这些合并、拆分路径的函数并不要求目录和文件要真实存在,它们只对字符串进行操作。
  91. # 对文件重命名:
  92. # os.rename('test.txt', 'test.py')
  93. # 删掉文件:
  94. # os.remove('test.py')
  95. # 如何利用Python的特性来过滤文件。
  96. # 列出当前目录下的所有目录:
  97. L = [x for x in os.listdir('.') if os.path.isdir(x)]
  98. print(L)
  99. # 列出当前目录下所有的.py后缀的文件
  100. L = [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
  101. print(L)
  102. # 练习
  103. #实现dir -l
  104. import os
  105. def mydir(path):
  106. if os.path.exists(path):
  107. L = [(path+x) for x in os.listdir(path)]
  108. print(L)
  109. else:
  110. print('The path not exists!')
  111. #编写一个程序,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径。
  112. def findrelapath(path):
  113. if os.path.exists(path):
  114. L = os.listdir(path)
  115. for x in L:
  116. newpath = os.path.join(path,x)
  117. if os.path.isfile(newpath):
  118. print(x)
  119. elif os.path.isdir(newpath):
  120. findrelapath(newpath)
  121. else:
  122. print('The path not exists!')
  123. ####################################################################################
  124. # 序列化
  125. # 在程序运行的过程中,所有的变量都是在内存中的
  126. # 一旦程序结束,变量所占用的内存就被操作系统全部回收。
  127. # 把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思
  128. # 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
  129. # 反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
  130. # Python提供了pickle模块来实现序列化。
  131. import pickle
  132. d = dict(name='bob', age=20, score=88)
  133. print(d['name'])
  134. print(d['age'])
  135. print(pickle.dumps(d))
  136. # pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件。
  137. f = open('dump.txt', 'wb')
  138. pickle.dump(d,f)
  139. f.close()
  140. # 看看写入的dump.txt文件,一堆乱七八糟的内容,这些都是Python保存的对象内部信息。
  141. # 当我们要把对象从磁盘读到内存时,可以先把内容读到一个bytes,然后用pickle.loads()方法反序列化出对象,也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象。
  142. f = open('dump.txt', 'rb')
  143. e = pickle.load(f)
  144. f.close()
  145. print(e)
  146. # 变量的内容又回来了!不过,这个变量和原来的变量是完全不相干的对象,它们只是内容相同而已。
  147. # Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容
  148. # JSON
  149. # 如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。
  150. # JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:
  151. # Python内置的json模块提供了非常完善的Python对象到JSON格式的转换。我们先看看如何把Python对象变成一个JSON:
  152. '''
  153. JSON类型 Python类型
  154. {} dict
  155. [] list
  156. "string" str
  157. 1234.56 int 或 float
  158. true/false True/False
  159. null None
  160. '''
  161. import json
  162. d = dict(name='bob', age=20, score=88)
  163. f = open('json.txt','w')
  164. json.dump(d,f)
  165. f.close()
  166. # dumps()方法返回一个str,内容就是标准的JSON。
  167. # .txt 文件中的内容:{"name": "bob", "age": 20, "score": 88}
  168. # 要把JSON反序列化为Python对象,用loads()或者对应的load()方法,
  169. # 前者把JSON的字符串反序列化,后者从file-like Object中读取字符串并反序列化:
  170. f = open('json.txt','r')
  171. s = f.read()
  172. d = json.loads(s)
  173. print(d)
  174. f.close()

python learning IO.py的更多相关文章

  1. python learning OOP2.py

    class Student(object): pass s = Student() s.name = 'Chang' # 给一个实例动态绑定一个属性 print(s.name) def set_age ...

  2. python learning OOP1.py

    class Student(object): # 构造函数 # 第一个参数永远是 self 表示一个实例本身,但是传参的时候不需要传 # 在Python中,实例的变量名如果以__开头,就变成了一个私有 ...

  3. python learning Exception & Debug.py

    ''' 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返 ...

  4. Python异步IO --- 轻松管理10k+并发连接

    前言   异步操作在计算机软硬件体系中是一个普遍概念,根源在于参与协作的各实体处理速度上有明显差异.软件开发中遇到的多数情况是CPU与IO的速度不匹配,所以异步IO存在于各种编程框架中,客户端比如浏览 ...

  5. Python Learning

    这是自己之前整理的学习Python的资料,分享出来,希望能给别人一点帮助. Learning Plan Python是什么?- 对Python有基本的认识 版本区别 下载 安装 IDE 文件构造 Py ...

  6. python异步IO编程(二)

    python异步IO编程(二) 目录 开门见山 Async IO设计模式 事件循环 asyncio 中的其他顶层函数 开门见山 下面我们用两个简单的例子来让你对异步IO有所了解 import asyn ...

  7. python下编译py成pyc和pyo

     python下编译py成pyc和pyo   其实很简单, 用 python -m py_compile file.py python -m py_compile /root/src/{file1,f ...

  8. python 装 ez_setup.py 出错

    python 装 ez_setup.py出错setuptools,pip,install,UnicodeDecodeError: 'ascii' codec can't decode byte.解决: ...

  9. Python文件IO

    Python文件IO 有如下文本内容,文件路径为D:\temp,文件名称为lyric.txt, line1 Look ! line2 If U had one shot line3 One oppor ...

随机推荐

  1. 网格布局(GridLayout) 行数与列数

    1.如果网格布局对象未指定具体的“行数”和“列数”,那么它将拥有1行和动态的列数. import java.awt.Button; import java.awt.Frame; import java ...

  2. 【Len's DMG】macOS Mojave 10.14.1 正式版 18B75 With Clover 4726原版镜像

    亮点:本次10.14.1正式版镜像更新config配置文件SMbios机型信息,让识别更趋于完善,自带去除10.14.1 USB端口限制补丁和最新USBInjectAll.kext,移除大量可能造成卡 ...

  3. 数据分析-pandas基础入门(一)

    最近在学习python,所以了解了一下Pandas,Pandas是基于NumPy的一个开源Python库,它被广泛用于快速分析数据,以及数据清洗和准备等工作. 首先是安装numpy以及pandas, ...

  4. c# multi-ply download ui

    first neet add an user control "DownloadBar": /* Created by SharpDevelop. User: gwang Date ...

  5. flex拖动图片

    <?xml version="1.0" encoding="utf-8"?><s:Application xmlns:fx="htt ...

  6. void与NULL详解

    void 是 “空”类型(无值型),意思是这种类型的大小无法确定. 并不存在void类型的对象,所以也就不能声明void类型的对象或者将sizeof()运算符用于void类型,C++/C语言不能对一个 ...

  7. cogs1889 [SDOI2008]Cave 洞穴勘测 link-cut tree

    link-cut tree // It is made by XZZ #include<cstdio> #include<algorithm> #define il inlin ...

  8. spring在service层获取session和request

    首先要在web.xml增加如下代码: <listener> <listener-class>org.springframework.web.context.request.Re ...

  9. 【ASP.NET Core】运行原理(2):启动WebHost

    本系列将分析ASP.NET Core运行原理 [ASP.NET Core]运行原理[1]:创建WebHost [ASP.NET Core]运行原理[2]:启动WebHost [ASP.NET Core ...

  10. 【ORACLE】ORACLE RAC设置控制文件多路

    [oracle@rac01 ~]$ srvctl stop database -d proc -o immediate [oracle@rac01 ~]$ sqlplus / as sysdba SQ ...