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. 打印出所有的中文字符
  2. ffmpeg库编译加文字_使用ffmpeg库编译错误及解决办法
  3. TYVJ P1053 字符串的展开 Label:字符 水
  4. 你应该知道的7个写出更好的 Java 代码的技巧
  5. opengl关于obj文件相关知识
  6. 黑盒测试——自动饮料售货机
  7. mysql主从是同步还是异步_mysql主从同步异步场景的分析
  8. Python入门-散点图绘制
  9. intrinsicContentSize和Content Hugging Priority
  10. rocketmq下单支付场景
  11. linux下c语言创建进程实验报告,linux下的c语言编程实验报告
  12. 博图安装msi失败_西门子软件WIN7系统安装须知
  13. CS144——Lab0——networking warmup
  14. python数据分析实验报告心得_Python实训周总结
  15. Java从入门到精通章节练习题——第六章
  16. transact sql
  17. ArcGIS制图学习(1)
  18. GitHub 又又又多了一个新主题 —— Dimmed Dark 主题!
  19. 《弃子长安》第十五章 人断惊崖
  20. java中<<与>>的意思

热门文章

  1. 2.5亿被腰围改变的中国人,哪个省胖子最多?
  2. 路由怎么定位到当前页面的组件_Angular 重载当前路由
  3. 巴特沃斯滤波器应用场合_巴特沃斯数字低通滤波器设计及应用
  4. java 对象 读写锁_读写锁的java实现
  5. php如何判断多文件上传,php多文件上传
  6. java 中断线程 wait_Java 线程中断(interrupt)与阻塞 (park)的区别
  7. python基础教程:startswith()和endswith()的用法
  8. python的if not用法
  9. 计算机进入安全模式,电脑怎么进入安全模式
  10. 修改mongodb最大查询数_关于MongoDB最大连接数的查看与修改