1.打开文件

>>> f = open('/Users/michael/test.txt', 'r')

2.文件不存在报错

>>> f=open('/Users/michael/notfound.txt', 'r')

Traceback (most recent call last): File "", line 1, in FileNotFoundError: [Errno 2]

No such file or directory: '/Users/michael/notfound.txt'

3.读文件

>>> f.read()'Hello, world!'

4.关闭文件

>>> f.close()

5.最终代码

try:

f = open('/path/to/file', 'r')

print(f.read())

finally:

if f:

f.close()

用with 简化写法

with open('/path/to/file', 'r') as f:

print(f.read())

6.二进制文件读取

>>> f = open('/Users/michael/test.jpg', 'rb')

>>> f.read()b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节

7.字符编码

>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')

>>> f.read()

'测试'

遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:

>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')

8.写文件

写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件:

>>> f = open('/Users/michael/test.txt', 'w')

>>> f.write('Hello, world!')

>>> f.close()

忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with语句来得保险:

with open('/Users/michael/test.txt', 'w') as f:

f.write('Hello, world!')

要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转换成指定编码。

StringIO和BytesIO

1.StringIO

很多时候,数据读写不一定是文件,也可以在内存中读写。

StringIO顾名思义就是在内存中读写str。

>>> from io import StringIO

>>> f = StringIO()

>>> f.write('hello')

5

>>> f.write(' ')

1

>>> f.write('world!')

6

>>> print(f.getvalue())

hello world!

要读取StringIO,可以用一个str初始化StringIO,然后,像读文件一样读取:

>>> from io import StringIO

>>> f = StringIO('Hello!\nHi!\nGoodbye!')

>>> while True:

... s = f.readline()

... if s == '':

... break

... print(s.strip())

...

Hello!

Hi!

Goodbye!

BytesIO

StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。

BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes:

>> from io import BytesIO

>>> f = BytesIO()

>>> f.write('中文'.encode('utf-8'))

6

>>> print(f.getvalue())

b'\xe4\xb8\xad\xe6\x96\x87'

和StringIO类似,可以用一个bytes初始化BytesIO,然后,像读文件一样读取:

>>> from io import StringIO

>>> f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')

>>> f.read()

b'\xe4\xb8\xad\xe6\x96\x87'

操作文件和目录

Python内置的os模块也可以直接调用操作系统提供的接口函数。

1.获取操作系统

如果是posix,说明系统是Linux、Unix或Mac OS X,如果是nt,就是Windows

系统。

>>> import os

>>> os.name

# 操作系统类型'posix'

要获取详细的系统信息,可以调用uname()函数

>>> os.uname()

posix.uname_result(sysname='Darwin', nodename='MichaelMacPro.local',

release='14.3.0', version='Darwin Kernel Version 14.3.0: Mon Mar 23 11:59:05 PDT 2015;

root:xnu-2782.20.48~5/RELEASE_X86_64', machine='x86_64')

注意uname()函数在Windows上不提供,也就是说,os模块的某些函数是跟操作系统相关的。

2.环境变量

>>> os.environ

environ({'VERSIONER_PYTHON_PREFER_32_BIT': 'no',

'TERM_PROGRAM_VERSION': '326', 'LOGNAME': 'michael', 'USER': 'michael',

'PATH': '/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin

:/usr/local/mysql/bin', ...})

要获取某个环境变量的值,可以调用os.environ.get('key'):

>>> os.environ.get('PATH')

'/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/mysql/bin'

>>> os.environ.get('x', 'default')

'default'

3.操作文件和目录

操作文件和目录的函数一部分放在os模块中,一部分放在os.path

模块中,这一点要注意一下。查看、创建和删除目录可以这么调用:

# 查看当前目录的绝对路径:

>>> os.path.abspath('.')

'/Users/michael'

# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:

>>> os.path.join('/Users/michael', 'testdir')

'/Users/michael/testdir'

# 然后创建一个目录:

>>> os.mkdir('/Users/michael/testdir')

# 删掉一个目录:

>>> os.rmdir('/Users/michael/testdir')

要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()

函数,这样可以把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名:

>>> os.path.split('/Users/michael/testdir/file.txt')

('/Users/michael/testdir', 'file.txt')

os.path.splitext()可以直接让你得到文件扩展名,很多时候非常方便:

>>> os.path.splitext('/path/to/file.txt')

('/path/to/file', '.txt')

# 对文件重命名:

>>> os.rename('test.txt', 'test.py')

# 删掉文件:

>>> os.remove('test.py')

shutil模块提供了copyfile()的函数

列出所有目录

>>> [x for x in os.listdir('.') if os.path.isdir(x)]

['.lein', '.local', '.m2', '.npm', '.ssh', '.Trash', '.vim', 'Applications',

'Desktop', ...]

要列出所有的.py文件,也只需一行代码:

>>> [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']

['apis.py', 'config.py', 'models.py', 'pymonitor.py', 'test_db.py',

'urls.py', 'wsgiapp.py']

```

***

###序列化

####1.把一个对象序列化并写入文件

```

>>> import pickle

>>> d = dict(name='Bob', age=20, score=88)

>>> pickle.dumps(d)

b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00scoreq\x02KXX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.'

```

pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件。或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object:

```

>>> f = open('dump.txt', 'wb')

>>> pickle.dump(d, f)

>>> f.close()

```

反序列化

```

>>> f = open('dump.txt', 'rb')

>>> d = pickle.load(f)

>>> f.close()

>>> d

{'age': 20, 'score': 88, 'name': 'Bob'}

```

####JSON

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

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2061490-977a41987192216a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

Python内置的**json**模块提供了非常完善的Python对象到JSON格式的转换

```

>>> import json

>>> d = dict(name='Bob', age=20, score=88)

>>> json.dumps(d)

'{"age": 20, "score": 88, "name": "Bob"}'

```

由于JSON标准规定JSON编码是UTF-8,所以我们总是能正确地在Python的str与JSON的字符串之间转换。

####对象序列化

```

import json

class Student(object):

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

self.name = name

self.age = age

self.score = score

s = Student('Bob', 20, 88)

print(json.dumps(s))

```

运行代码,毫不留情地得到一个TypeError

```

Traceback (most recent call last): ...TypeError:

<__main__.Student object at 0x10603cc50> is not JSON serializable

```

[https://docs.python.org/3/library/json.html#json.dumps](https://docs.python.org/3/library/json.html#json.dumps)

可选参数default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为Student专门写一个转换函数,再把函数传进去即可

```

def student2dict(std):

return {

'name': std.name,

'age': std.age,

'score': std.score

}

```

这样,Student实例首先被student2dict()函数转换成dict,然后再被顺利序列化为JSON:

```

>>> print(json.dumps(s, default=student2dict))

{"age": 20, "name": "Bob", "score": 88}

```

不过,下次如果遇到一个Teacher类的实例,照样无法序列化为JSON。我们可以偷个懒,把任意class的实例变为dict:

```

print(json.dumps(s, default=lambda obj: obj.__dict__))

```

同样的道理,如果我们要把JSON反序列化为一个Student对象实例,loads()方法首先转换出一个dict对象,然后,我们传入的object_hook函数负责把dict转换为Student实例:

```

def dict2student(d):

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

```

```

>>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'

>>> print(json.loads(json_str, object_hook=dict2student))

<__main__.Student object at 0x10cd3c190>

```

python io_python-IO相关推荐

  1. python io_Python 的 io.StringIO()

    原博文 2019-10-02 22:13 − 引例1 代码: import pandas as pd from io import StringIO csv_data = ""&q ...

  2. python 文件IO

    一.IO.同步IO和异步IO IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等 ...

  3. python文件都是脚本吗_脚本语言系列之Python | Python文件IO

    Python是做自动化工作首选的一门语言,与更复杂的语言相比,Python 非常便于快速学习.语法很少,具有良好的 可读性,即使测试工程师们没有丰富的编码经验,也能快速学会:Python 的极简风格对 ...

  4. Python(十三)IO编程

    IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口. 比如你打开 ...

  5. python 异步io 写excel_python异步IO编程(二)

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

  6. python的io模块

    open函数是一个工厂函数.根据传入的变量,open函数会进行文件的开启.文件对象的创建与设定,然后返回文件对象.我们来看一下指定不同变量时,open函数具体为我们返回了什么类型的文件对象呢: > ...

  7. Python的io模块详解

    Python的io模块提供了多个流式处理接口,具体的处理函数实现位于_pyio.py模块中. 在_io.py模块中,提供了唯一的模块方法open(name, mode=None, buffering= ...

  8. Python中IO流与File对象

    IO流: 什么叫做IO stream(input output stream):输入输出流 指的就是内存数据的读入和写出!!!! 广义上来说,IO流指的就是数据到磁盘.到另一电脑间(socket)的都 ...

  9. Python 文件 IO 操作详解

    Python 文件 IO 操作详解 1.文件 IO 常用操作 2.文件打开操作 2.1 打开命令 2.2 命令参数 2.2.1 路径 2.2.2 mode 2.2.3 buffering 缓冲区 2. ...

  10. python中IO编程中关于StringIO的读写问题

    阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量.文章设置为仅粉丝可见,是因为写博客确实花了不少精力.希望互相进步谢谢!! 文章目录 阅读前请看一下:我是一个热衷于记 ...

最新文章

  1. 关上Deepfake的潘多拉魔盒,RealAI推出深度伪造视频检测工具
  2. SanFengClound
  3. Java中把JSON和List结果集互转的代码片段整理
  4. 实时平台在趣头条的建设实践
  5. python 换脸 github_人脸识别和换脸相关深度学习开源项目github汇总
  6. 【unity3d--初始学习五--c#脚本对xml文件的创建和解析】
  7. JavaScript密码复杂度
  8. 求最长回文串-从动态规划到马拉车之路(下)
  9. js实现excel块拖拉数据_Excel操作比Python更方便?常见数据操作Excel实现和Python实现的比较...
  10. android对错图标,Android Studio Gradle图标错误,清单合并
  11. Python绘制三次贝塞尔曲线
  12. Linux学习总结(八)-磁盘格式化,挂载,swap扩容
  13. POJ 1751 Highways (kruskal)
  14. 第十三章:位图(八)
  15. android MVC
  16. java多个点求连线_实现简单的粒子连线
  17. 【思维导图】本博客技术思维导图
  18. 解决LaTeX中的\pdfendlink ended up in different nesting level than \pdfstartlink.问题
  19. 计算机桌面怎么换服,台式电脑怎么换桌面壁纸
  20. Python编程从入门到实践 第一部分基础知识 代码合集

热门文章

  1. 释放数据价值,大数据分析如何助力电商获客又增收?
  2. 不疯狂的外星人,已疯狂的资本
  3. python 读grid 数据_科学网—Python_机器学习_总结14:Grid search - 李军的博文
  4. 如何用python生成表格_用 Python 生成 HTML 表格
  5. 什么时候出python4_Python4要来了?快来看看Python之父怎么说
  6. owdcloud mysql_MySQL在Ubuntu远程配置
  7. 【Python学习教程】推导式与生成器
  8. python中修改列表元素的2种方法
  9. 19道Python基础列表元祖的练习题
  10. 30段极简Python代码:这些小技巧你都Get了么?