文件读写

StringIO和BytesIO

操作文件和目录

序列化

学习廖老师的py官网的笔记

1、stream的概念。数据交换通常需要建立两根“水管”。

2、同步IO和异步IO。异步性能高,但是编程模型复杂。

3、操作IO的功能是操作系统提供的!不论是Java还是Pyton都只是将低级接口封装起来供开发者使用。

【文件读写】

读文件

1、简单的

>>> f = open('ask.txt', 'r')
>>> f.read()
'我想你最近一定很忙。'
>>>

但是要记得关掉(文件对象会占操作系统的资源)

>>> f.close()

但是有时候读文件可能会抛出错误,例如:文件不存在。为了保证最后一定会把文件关掉,必须使用一定会执行的finally语句。

try:
f = open('ask.txt', 'r')
print(f.read())
finally:
if f:
f.close()

有一种等价写法:

with open('ask.txt') as f:
print(f.read())

2、逐行读取。

with open('ask.txt', 'r') as f:
for line in f.readlines():
print(line.strip()) #print自带换行的效果,这里的strip把'\n'去掉。

file-like Object:有read方法的对象。

读取二进制:

# -*- coding: utf-8 -*-
# read byte
# 默认情况下都是读取文本文件
# 如果要读取图片等文件
with open('a.png', 'rb') as f:
print(f.read())

读取非UTF-8编码的文件:

errrors参数表示遇到编码错误直接忽略。

写文件

类比读文件就可以了。

简单的例子

>>> with open('ask.txt', 'w') as f:
... f.write('所以你只要看前三个字就好')
...
12
>>> with open('ask.txt', 'w', errors='ignore') as f:
... f.write('所以你只要看前三个字就好')
...
12

不知道为什么会有返回值。

【StringIO和BytesIO】

在内存中读写。

StringIO

>>> from io import StringIO
>>> f = StringIO()
>>> f.write('床前明月光')
5
>>> f.write(' 疑是地上霜')
6
>>> f.getvalue()
'床前明月光 疑是地上霜'

可以理解为在内存中的一个“文件”,因为操作StringIO和操作file没有太大区别:

>>> f = StringIO('i\nmiss\nyou!')
>>> while True:
... s = f.readline() # 读取掉一行
... if s == '': # 如果已经读完
... break
... print(s.strip())
...
i
miss
you!

BytesIO

>>> from io import BytesIO
>>> f = BytesIO('abc123')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: a bytes-like object is required, not 'str'
>>> f = BytesIO(b'abc123')
>>> f.read()
b'abc123'

【操作文件和目录】

os模板是操作系统相关的。

>>> import os
>>> os.name
'nt'

环境变量

>>> os.environ
environ({'SYSTEMDRIVE': 'C:', 'ALLUSERSPROFILE': 'C:\\ProgramData', 'PUBLIC': 'C:\\Users\\Public', 'LOCALAPPDATA': 'C:\\Users\\mdzz\\AppData\\Local', 'USERDOMAIN': 'LAPTOP-QGECNCGO', 'SYSTEMROOT': 'C:\\WINDOWS', 'PSMODULEPATH': 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules', 'TMP': 'C:\\Users\\mdzz\\AppData\\Local\\Temp', 'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe', 'NUMBER_OF_PROCESSORS': '', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 94 Stepping 3, GenuineIntel', 'PATH': 'C:\\ProgramData\\Oracle\\Java\\javapath;C:\\Program Files (x86)\\Intel\\iCLS Client\\;C:\\Program Files\\Intel\\iCLS Client\\;C:\\windows\\system32;C:\\windows;C:\\windows\\System32\\Wbem;C:\\windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C:\\Program Files\\Intel\\WiFi\\bin\\;C:\\Program Files\\Common Files\\Intel\\WirelessCommon\\;C:\\Program Files\\MySQL\\MySQL Server 5.5\\bin;C:\\maven\\apache-maven-3.3.9\\bin;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\MinGW\\bin;C:\\Program Files\\Java\\jdk1.8.0_101\\bin;C:\\Users\\mdzz\\AppData\\Local\\Programs\\Python\\Python35\\Scripts\\;C:\\Users\\mdzz\\AppData\\Local\\Programs\\Python\\Python35\\;C:\\Users\\mdzz\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\mdzz\\AppData\\Roaming\\npm;C:\\Users\\mdzz\\AppData\\Local\\atom\\bin', 'LOGONSERVER': '\\\\LAPTOP-QGECNCGO', 'MOZ_PLUGIN_PATH': 'C:\\Program Files (x86)\\Foxit Software\\Foxit Reader\\plugins\\', 'PROGRAMFILES': 'C:\\Program Files', 'ONLINESERVICES': 'Online Services', 'USERNAME': 'mdzz', 'PROCESSOR_LEVEL': '', 'PROMPT': '$P$G', 'HOMEPATH': '\\Users\\mdzz', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 'COMPUTERNAME': 'LAPTOP-QGECNCGO', 'WINDIR': 'C:\\WINDOWS', 'ONEDRIVE': 'C:\\Users\\mdzz\\OneDrive', 'USERDOMAIN_ROAMINGPROFILE': 'LAPTOP-QGECNCGO', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'MAVEN_HOME': 'C:\\maven\\apache-maven-3.3.9', 'PROGRAMW6432': 'C:\\Program Files', 'TEMP': 'C:\\Users\\mdzz\\AppData\\Local\\Temp', 'VS140COMNTOOLS': 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\Tools\\', 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_101', 'PROGRAMDATA': 'C:\\ProgramData', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'CLASSPATH': '.;C:\\Program Files\\Java\\jdk1.8.0_101lib;C:\\Program Files\\Java\\jdk1.8.0_101lib\\tools.jar', 'USERPROFILE': 'C:\\Users\\mdzz', 'REGIONCODE': 'APJ', 'PLATFORMCODE': 'KV', 'HOMEDRIVE': 'C:', 'PROCESSOR_REVISION': '5e03', 'APPDATA': 'C:\\Users\\mdzz\\AppData\\Roaming', 'OS': 'Windows_NT', 'PROCESSOR_ARCHITECTURE': 'AMD64', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files'})

获取某个具体环境变量的值:

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

操作文件和目录

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

操作文件和目录基本可以映射为在命令行下操作文件和目录:

>>> import os
>>> os.path.abspath('.')
'D:\\labs'

创建目录:

>>> os.path.join('D:\\labs', 'TestDir') # 这个时候没有真的创建
'D:\\labs\\TestDir'
>>> os.mkdir('D:\\labs\\TestDir') # 真的创建了
>>> os.rmdir('D:\\labs\\TestDir') # 删掉!

之所以使用os.path.join()函数,是因为在不同操作系统上文件分隔符是不同的,这样可以正确处理。

同样,要拆分文件路径,也需要使用特殊的函数os.path.split(),os.path.splitext()可以直接获得文件拓展名。

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

列出当前路径下的所有文件:

>>> [x for x in os.listdir('.')]
['2.cpp', '4.cpp', '5.cpp', 'a.exe', 'a.png', 'ask.txt', 'c++task', 'cpppojects3月六日', 'cpppojects3月 六日.rar', 'Dada', 'Employee', 'input.txt', 'javaDocTest', 'MyTest', 'MyTest.class', 'MyTest.java', 'output.txt', 'pictest', 'picture1.jpg', 'prog1.cpp', 'Sales_data.h', 'separatecp', 'student.sql', 'sum_test.py', 'sum_test.py.bak', 'test.py', 'test.py.bak', '__pycache__']

筛选出文件夹:

>>> [x for x in os.listdir('.') if os.path.isdir(x)]
['c++task', 'cpppojects3月六日', 'Dada', 'Employee', 'javaDocTest', 'MyTest', 'pictest', 'separatecp', '__pycache__']

筛选出所有py文件:

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

【序列化】

序列化:变量从内存中变成可存储或传输的过程。

被叫做pickling、serialization、marshalling、flattening等。

把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。

Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据.

尝试:

>>> import pickle
>>> d = dict(name = 'xkfx', age = )
>>> pickle.dumps(d)
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00xkfxq\x02X\x03\x00\x00\x00ageq\x03K\x13u.'
>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()
>>> f= open('dump.txt', 'rb')
>>> d = pickle.load(f)
>>> f.close()
>>> d
{'name': 'xkfx', 'age': }

JSON

JSON是什么?

-----JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。

JSON是干嘛的?

为什么是JSON?

JSON与Python

要在不同的语言中传递数据,就必须把数据序列化成标准格式。例如在Python和Java中交互数据。

JSON比XML好一些。

JSON表示的对象就是标准的JavaScript语言的对象.

对应关系:

Python内置的json模块提供了非常完善的Python对象到JSON格式的转换。JSON标准规定JSON编码是UTF-8。

尝试:

>>> import json
>>> i = dict(name = 'xkfx', age = 19)
>>> json.dumps(d)
'{"name": "xkfx", "age": 19}' # 这个str是标准的JSON
>>> str = '{"name": "xkfx", "age": 19}'
>>> json.loads(str)
{'name': 'xkfx', 'age': 19}

对象的dumps()和loads()。

1、尝试直接dumps()一个对象:

import json

class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score s = Student('xkfx', 19, 20)
print(json.dumps(s))

抛出错误:

s = Student('xkfx', 19, 20)
print(json.dumps(s))

2、失败的原因是dumps()不懂得如何将s引用的对象序列化。这样的话,只需要告诉dumps如何将对象序列化就可以了。

def student2dict(std):
return {
'name' : std.name,
'age' : std.age,
'score' : std.score
} s = Student('xkfx', 19, 20)
print(json.dumps(s, default=student2dict))
$ python test.py
{"age": 19, "score": 20, "name": "xkfx"}

3、但是,如果对于每个类都要写对应的序列化方法也未免太麻烦了。所以有一种偷懒的方法:

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

每个对象自带有dict,通过.dict访问

print(s.__dict__)
print(json.dumps(s, default=lambda obj: obj.__dict__))
python test.py
{'score': 20, 'age': 19, 'name': 'xkfx'} # 原始dict
{"score": 20, "age": 19, "name": "xkfx"} # 序列化成JSON

4、反序列化也是同样的道理,loads不知道如何反序列化,必须传入一个方法告诉它怎么做,不同的是反序列化无法偷懒!:

def dict2student(d):
return Student(d['name'], d['age'], d['score']) json_data = '{"age": 19, "score": 20, "name": "xkfx"}'
print(json.loads(json_data, object_hook=dict2student))
<__main__.Student object at 0x0000022226F0B630>

【Python】IO编程的更多相关文章

  1. Python IO编程

    IO在计算机中指Input/Output,也就是输入和输出 一.文件读写 1.读文件 >>> f = open('/Users/michael/test.txt', 'r') --- ...

  2. Python IO编程-读写文件

    1.1给出规格化得地址字符串,这些字符串是经过转义的能直接在代码里使用的字符串 需要导入os模块 import os >>>os.path.join('user','bin','sp ...

  3. python IO编程-序列化

    原文链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143192607 ...

  4. python IO编程-StringIO和BytesIO

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

  5. Python IO编程-组织文件

    对于日常中遇到的批量任务,有些可以通过请求python完成自动化,我非常渴望拥有这些能力,在去年学习了python读写文件之后,我马上迫不及待的开始学习‘组织文件’,经过学习,我发现python组织文 ...

  6. python 网络编程 IO多路复用之epoll

    python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解     此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...

  7. Python之IO编程——文件读写、StringIO/BytesIO、操作文件和目录、序列化

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

  8. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...

  9. Python并发编程二(多线程、协程、IO模型)

    1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于 ...

  10. python安装与IO编程

    <python爬虫开发与项目实战>基础篇(一) 一.python安装 1.python IDLE 下载官网:www.python.org 注:在选择安装组件时勾选所有组件,特别注意勾选pi ...

随机推荐

  1. UILabel 行间距设置

    NSMutableAttributedString * attributedString1 = [[NSMutableAttributedString alloc] initWithString:te ...

  2. 移动端form表单

    始终绑定submit事件 不单独的对[提交]按钮绑定click事件,对整个表单绑定submit提交事件,这样可以让整个表单内的文本框获得Enter提交的VIP待遇,并且在移动端中可以让文本框聚焦时键盘 ...

  3. java中Logger.getLogger(Test.class),即log4日志的使用

    log4的使用方法: log4是具有日志记录功能,主要通过一个配置文件来对程序进行监测有两种配置方式:一种程序配置,一种文件配置有三个主要单元要了解,Logger,appender,layout. l ...

  4. 安装mysql最后一步未响应,卡死。(解决方法mySql5.5,以及安装教程)

    安装教程:http://www.server110.com/mysql/201308/784.html 重装mysql的时候,总是在提交配置后的最后一步,安装失败,进程管理器里显示程序无响应,mysq ...

  5. 用于把List<Object>转换成Map<String,Object>形式

    /** * 用于把List<Object>转换成Map<String,Object>形式,便于存入缓存 * @author zhang_bo * @param keyName ...

  6. mysql 字符集研究

    一.创建一个测试数据库 及一个测试用的表.均使用默认的编码方式. show variables like 'char%': mysql> show variables like 'char%'; ...

  7. ipconfig /flushdns

    C:\Users\sas>ipconfig /flushdns Windows IP 配置 已成功刷新 DNS 解析缓存. C:\Users\sas>ipconfig --help 错误: ...

  8. C++的全部目标就是最优化资源的利用,以人付出更多为代价。Python刚好是另一个极端(Bjarne就说,一个人至少应该掌握两种计算机语言)

    说 C++ 反人类,是如果把 C++ 看作人(程序员)和资源(电子系统)的桥梁,他的全部目标就是最优化资源的利用,以人付出更多为代价.Python刚好是另一个极端.做好两个一起学.Bjarne就说,一 ...

  9. shipyard 中文版安装 -- Docker web管理

    #本文使用markdown文档格式 #Docker web管理平台 #shipyard 中文版安装 #hipyard可对容器.镜像.仓库.docker节点进行管理的web系统 #+++++++++++ ...

  10. Python高级特性(1):Iterators、Generators和itertools(转)

    译文:Python高级特性(1):Iterators.Generators和itertools [译注]:作为一门动态脚本语言,Python 对编程初学者而言很友好,丰富的第三方库能够给使用者带来很大 ...