前言

最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖子,廖雪峰的课程连接在这里:廖雪峰
Python的相关介绍,以及它的历史故事和运行机制,可以参见这篇:python介绍
Python的安装可以参见这篇:Python安装
Python的运行模式以及输入输出可以参见这篇:Python IO
Python的基础概念介绍,可以参见这篇:Python 基础
Python字符串和编码的介绍,可以参见这篇:Python字符串与编码
Python基本数据结构:list和tuple介绍,可以参见这篇:Python list和tuple
Python控制语句介绍:ifelse,可以参见这篇:Python 条件判断
Python控制语句介绍:循环实现,可以参见这篇:Python循环语句
Python数据结构:dict和set介绍Python数据结构dict和set
Python函数相关:Python函数
Python高阶特性:Python高级特性
Python高阶函数:Python高阶函数
Python匿名函数:Python匿名函数
Python装饰器:Python装饰器
Python偏函数:Python偏函数
Python模块:Python模块
Python面向对象编程(1):Python面向对象
Python面向对象编程(2):Python面向对象(2)
Python面向对象编程(3):Python面向对象(3)
Python面向对象编程(4):Pyhton面向对象(4)
Python面向对象高级编程(上):Python面向对象高级编程(上)
Python面向对象高级编程(中上):Python面向对象高级编程(中上)
Python面向对象高级编程(中下):Python面向对象高级编程(中下)
Python面向对象高级编程(完):Python面向对象高级编程(完)
Python错误调试(起):Python调试:起
Python错误调试(承):Python调试:承
Python错误调试(转):Python调试:转
Python错误调试(合):python调试:合
Python文件IO编程:Python文件IO

目录:

  • 前言
  • 基本I/O编程流
    • StringIO
    • BytesIO
    • 小结
  • 命令行操作文件和目录
    • 环境变量
    • 操作文件和目录
    • 小结
    • 练习

基本I/O编程流

StringIO

很多时候,数据读写不一定要经过文件接口这个渠道,还可以直接在内存中读写(很明显的优点是速度更快)。
StringIO顾名思义就是在内存中读写str。
要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可:

>>> from io import StringIO
>>> f = StringIO()
>>> f.write('hello')
5
>>> f.write(' ')
1
>>> f.write('world!')
6
>>> print(f.getvalue())
hello world!

getvalue()方法用于获得写入后的str。
要读取StringIO,可以用一个str初始化StringIO,然后,像读文件一样读取:

>>> from io import StringIO
>>> f = StringIO('Hello!\nHi!\nGoodbye!')
>>> while True:s = f.readline()if s == '':breakprint(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'

请注意,写入的不是str,而是经过UTF-8编码的bytes。
和StringIO类似,可以用一个bytes初始化BytesIO,然后,像读文件一样读取:

小结

StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口。

命令行操作文件和目录

如果我们要操作文件、目录,可以在命令行下面输入操作系统提供的各种命令来完成。比如dir、cp等命令。
如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操作系统提供的接口函数,Python内置的os模块也可以直接调用操作系统提供的接口函数。
打开Python交互式命令行,我们来看看如何使用os模块的基本功能:

>>> import os
>>> os.name # 操作系统类型
'posix'

如果是posix,说明系统是Linux、Unix或Mac OS X,如果是nt,就是Windows系统。
要获取详细的系统信息,可以调用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模块的某些函数是跟操作系统相关的。

环境变量

在操作系统中定义的环境变量,全部保存在os.environ这个变量中,可以直接查看:

>>> 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')
''C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v9.2\\bin;C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v9.2\\libnvvp;C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v9.0\\bin;'
>>> os.environ.get('x', 'default')
'default'

操作文件和目录

操作文件和目录的函数一部分放在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.join()函数,这样可以正确处理不同操作系统的路径分隔符。在Linux/Unix/Mac下,os.path.join()返回这样的字符串,
part-1/part-2
而windows下会返回这样的字符串:

part-1\\part-2

同样的道理,要拆分路径时,也不要直接去拆字符串,而要通过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')

这些合并、拆分路径的函数并不要求目录和文件要真实存在,它们只对字符串进行操作。

文件操作使用下面的函数。假定当前目录下有一个test.txt文件:

# 对文件重命名:
>>> os.rename('test.txt', 'test.py')
# 删掉文件:
>>> os.remove('test.py')

但是复制文件的函数居然在os模块中不存在!原因是复制文件并非由操作系统提供的系统调用。理论上讲,我们通过上一节的读写文件可以完成文件复制,只不过要多写很多代码。

幸运的是shutil模块提供了copyfile()的函数,你还可以在shutil模块中找到很多实用函数,它们可以看做是os模块的补充。

最后看看如何利用Python的特性来过滤文件。比如我们要列出当前目录下的所有目录,只需要一行代码:

>>> [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']
'check_exampe.py', 'exampes_triangles_2.py', 'exampe_high.py', 'exampe_mapreduce.py', 'exampe_re3.py', 'example_.py', 'example_byteIO.py', 'example_decorator.py', 'example_decorator2.py', 'example_decorator3.py', 'example_decorator4.py', 'example_doctest.py', 'example_doctest2.py', 'example_download.py', 'example_download2.py', 'example_fact.py', 'example_filter1.py', 'example_filter2.py', 'example_filter3.py', 'example_find.py', 'example_function.py', 'example_generator.py', 'example_Hanno.py', 'example_IO1.py', 'example_Io2.py', 'example_IO3.py', 'example_IO4.py', 'example_listgenerater.py', 'example_mapreduce.py', 'example_module1.py', 'example_module2.py', 'example_month_2.py', 'example_Multifunc.py', 'example_mydict.py', 'example_mytest.py', 'example_normalize.py', 'example_one.py', 'example_oop1.py', 'example_oop10.py', 'example_oop11.py', 'example_oop12.py', 'example_oop13.py', 'example_oop14.py', 'example_oop15.py', 'example_oop16.py', 'example_oop17.py', 'example_oop18.py', 'example_oop2.py', 'example_oop3.py', 'example_oop4.py', 'example_oop5.py', 'example_oop6.py', 'example_oop7.py', 'example_oop8.py', 'example_oop9.py', 'example_power.py', 'example_power1.py', 'example_print.py', 'example_print2.py', 'example_re.py', 'example_re2.py', 'example_re3.py', 'example_re4.py', 'example_reduce.py', 'example_reduce2.py', 'example_sorted.py', 'example_strip.py', 'example_test1.py', 'example_test2.py', 'example_test3.py', 'example_test4.py', 'example_test5.py', 'example_test6.py', 'example_test7.py', 'example_triangles.py', 'example_variable.py', 'generator_check.py']

是不是非常简洁?

小结

Python的os模块封装了操作系统的目录和文件操作,要注意这些函数有的在os模块中,有的在os.path模块中。

练习

1 利用os模块编写一个能实现dir -l输出的程序。

2 编写一个程序,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径。

import osdef findfile(path,filename):for x in os.listdir(path):x=os.path.join(path,x)if os.path.isdir(x):findfile(x,filename)else:if filename in os.path.split(x)[1]:print(x)return
filename=input('请输入要查找的文件名:')
findfile(os.path.abspath('.'),filename)

Python学习笔记:IO编程StringIO和BytesIO相关推荐

  1. python学习笔记---IO编程【廖雪峰】

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

  2. python学习笔记——多线程编程

    python学习笔记--多线程编程 基础不必多讲,还是直接进入python. Python代码代码的执行由python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时 ...

  3. Python学习笔记:网络编程

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  4. python IO编程-StringIO和BytesIO

    链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319187857 ...

  5. 廖雪峰python学习笔记——函数式编程

    一个简单粗暴的内置函数: reduce()和map()的区别: map()是将函数依次作用到每个参数上,而reduce()相当于是迭代,而且每次都必须是两个参数. 用reduce()和map完成str ...

  6. python学习笔记8--socket编程

    一.socket Socket的英文原义是"孔"或"插座".作为BSD UNIX的进程通信机制,取后一种意思.通常也称作"套接字",用于描述 ...

  7. Python学习之面向对象编程

    Python学习目录 在Mac下使用Python3 Python学习之数据类型 Python学习之函数 Python学习之高级特性 Python学习之函数式编程 Python学习之模块 Python学 ...

  8. Python学习笔记:异步IO(3)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  9. Python学习笔记:异步IO(2)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

最新文章

  1. 【备份恢复】Oracle 数据备份与恢复微实践
  2. 百度吴恩达:图像和音视频搜索是人工智能新方向
  3. 黑客技术的网站(❤️可以自学,建议收藏❤️)
  4. ReactJS学习 相关网站
  5. java生成随机十位数_随机10位字符串生成
  6. sprintf()函数的用法
  7. sgx芯片服务器,英特尔SGX概述:SGX内部实现分析研究(part1)
  8. JavaScript之排他思想详述
  9. 【转】Quartz概述及入门实例
  10. 开机启动计算机时 屏幕无显示桌面,开机时电脑黑屏没有出现桌面怎么处理
  11. JAVA程序开发参考手册
  12. 那些年我们没能bypass的xss filter[from wooyun]
  13. 请你设计一个用于填充n阶方阵的上三角区域的程序。
  14. 6年全栈工程师回答:web前端的主要学习什么,现在还有前途吗?一般工资是多少?
  15. java调用oracle过程,JAVA调用ORACLE存储过程报错
  16. 财务审计工作内容有哪些
  17. XXL-JOB核心源码解读及时间轮原理剖析
  18. .NET Framework是什么?
  19. ADSL与PPPoE的区别
  20. 天勤接口查询所有期货品种交易时间

热门文章

  1. 三月苏州健康小贴士!!!健康生活从我做起
  2. 多线程中使用UNITY变量导致线程执行断掉却又不报错的问题
  3. sscanf 的应用noj——663弟弟的作业
  4. ubuntu编译并调试OpenJDK8源码实践
  5. 爱立信更换集团CTO Erik Ekudden将于7月1日上任
  6. Jsch ssh登陆
  7. Chrome插件会干坏事儿的
  8. linux下的ps 查看进程命令
  9. 《C++游戏开发》十八 角色在障碍物中智能行走的实现
  10. 类模板非类型形参实现Stack