IO在计算机中指Input/Output,也就是输入和输出。
文件读写
在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)
"""
读文件
"""
f = open(r'D:\Code\Python\res/rawData.txt', 'r')
strings = f.read()
print(strings)
f.close()
1988 15.73 15037 18.8 1366
1989 15.04 17001 18 1519
1990 14.39 18718 3.1 1644
1991 12.98 21826 3.4 1893
1992 11.6 26937 6.4 2311
1993 11.45 35260 14.7 2998
1994 11.21 48108 24.1 4044
1995 10.55 59811 17.1 5046
1996 10.42 70142 8.3 5846
1997 10.06 78061 2.8 6420
1998 9.14 83024 -0.8 6796
1999 8.18 88479 -1.4 7159
2000 7.58 98000 0.4 7858
2001 6.95 108068 0.7 8622
2002 6.45 119096 -0.8 9398
2003 6.01 135174 1.2 10542
2004 5.87 159587 3.9 12336
2005 5.89 184089 1.8 14040
2006 5.38 213132 1.5 16024
2007 5.24 235367 1.7 17535
2008 5.45 277654 1.9 19264
Process finished with exit code 0
调用read()会一次性读取文件的全部内容
调用readline()可以每次读取一行的内容吗,并按行返回list
"""
写文件
"""
text = "Hello World!"
with open(r'D:/Code/Python/result/hello.txt', 'w') as f:
f.write(text)
StringIO和BytesIO
有时候,数据读写不一定是文件,也可以在内存中读写
其中StringIO用来操作str,BytesIO实现了内存中读写bytes
from io import StringIO
f = StringIO()
f.write("Hello")
f.write(" ")
f.write("World")
print(f.getvalue())
Hello World
Process finished with exit code 0
data = StringIO("Hello\nWorld\nTom\nSam")
for line in data.readlines():
print(line.strip())
Hello
World
Tom
Sam
from io import BytesIO
f = BytesIO()
f.write('翯'.encode('utf-8'))
print(f.getvalue())
b'\xe7\xbf\xaf'
Process finished with exit code 0
f1 = BytesIO(b'\xe7\xbf\xaf')
print(f1.read())
b'\xe7\xbf\xaf'
Process finished with exit code 0
操作文件和目录
import os
# 操作系统的类型
print(os.name)
# 环境变量
print(os.environ)
# 查看当前目录的绝对路径
print(os.path.abspath('.'))
# 创建一个目录
os.mkdir('./dir')
# 删除一个目录
os.rmdir('./dir')
"""
操作文件和目录
"""
import os
# 操作系统的类型
print(os.name)
# 环境变量
print(os.environ)
# 查看当前目录的绝对路径
print(os.path.abspath('.'))
# 创建一个目录
# os.mkdir('./dir')
# 删除一个目录
# os.rmdir('./dir')
# 路径合并
print(os.path.join('part1', 'part2'))
# 路径分割
print(os.path.split('./test/file.txt'))
# 得到文件扩展名
print(os.path.splitext('./test/file.txt'))
# 文件重命名
# os.rename('test.txt', 'test.avi')
# 删除文件
# os.remove('test.avi')
nt
environ({'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\Martin\\AppData\\Roaming', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'LYH', 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe', 'CONDA_DEFAULT_ENV': 'base', 'CONDA_PREFIX': 'C:\\Users\\Martin\\anaconda3', 'CONDA_PROMPT_MODIFIER': '(base) ', 'CONDA_SHLVL': '1', 'CONFIGSETROOT': 'C:\\Windows\\ConfigSetRoot', 'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData', 'FPS_BROWSER_APP_PROFILE_STRING': 'Internet Explorer', 'FPS_BROWSER_USER_PROFILE_STRING': 'Default', 'GO111MODULE': 'on', 'GOPATH': 'D:\\Code\\Go;', 'HOMEDRIVE': 'C:', 'HOMEPATH': '\\Users\\Martin', 'IDEA_INITIAL_DIRECTORY': 'C:\\Program Files\\JetBrains\\PyCharm 2020.1.1\\bin', 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202', 'LOCALAPPDATA': 'C:\\Users\\Martin\\AppData\\Local', 'LOGONSERVER': '\\\\LYH', 'NUMBER_OF_PROCESSORS': '8', 'OCL_ROOT': 'D:\\OCL_SDK_Light', 'ONEDRIVE': 'C:\\Users\\Martin\\OneDrive', 'OS': 'Windows_NT', 'PATH': 'C:\\Users\\Martin\\anaconda3;C:\\Users\\Martin\\anaconda3\\Library\\mingw-w64\\bin;C:\\Users\\Martin\\anaconda3\\Library\\usr\\bin;C:\\Users\\Martin\\anaconda3\\Library\\bin;C:\\Users\\Martin\\anaconda3\\Scripts;C:\\Users\\Martin\\anaconda3\\bin;C:\\Users\\Martin\\anaconda3\\condabin;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0;C:\\Windows\\System32\\OpenSSH;C:\\Program Files\\Java\\jdk1.8.0_202\\bin;D:\\ProgramFiles\\Xshell;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\iCLS;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\iCLS;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;D:\\ProgramFiles\\Vim\\vim82;D:\\ffmpeg\\bin;D:\\Go\\bin;D:\\Scala\\bin;D:\\MATLAB\\R2018a\\runtime\\win64;D:\\MATLAB\\R2018a\\bin;D:\\nodejs;D:\\opencv\\build\\x64\\vc15\\lib;D:\\opencv\\build\\x64\\vc15\\bin;D:\\ProgramFiles\\Git\\cmd;D:\\MinGW\\bin;D:\\opencv\\mingw-build\\install\\x64\\mingw\\bin;C:\\Users\\Martin\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Program Files\\Microsoft VS Code\\bin;C:\\Users\\Martin\\anaconda3\\Scripts;D:\\ProgramFiles\\Fiddler;D:\\opencv\\build\\x64\\vc15\\bin;C:\\Users\\Martin\\go\\bin;C:\\Users\\Martin\\AppData\\Roaming\\npm', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 'PROCESSOR_ARCHITECTURE': 'AMD64', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 142 Stepping 10, GenuineIntel', 'PROCESSOR_LEVEL': '6', 'PROCESSOR_REVISION': '8e0a', 'PROGRAMDATA': 'C:\\ProgramData', 'PROGRAMFILES': 'C:\\Program Files', 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 'PROGRAMW6432': 'C:\\Program Files', 'PROMPT': '(base) $P$G', 'PSMODULEPATH': 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules', 'PUBLIC': 'C:\\Users\\Public', 'PYCHARM_DISPLAY_PORT': '63342', 'PYCHARM_HOSTED': '1', 'PYTHONCODE': 'utf-8', 'PYTHONIOENCODING': 'UTF-8', 'PYTHONPATH': 'D:\\Code\\Python\\PythonStudy;C:\\Program Files\\JetBrains\\PyCharm 2020.1.1\\plugins\\python\\helpers\\pycharm_matplotlib_backend;C:\\Program Files\\JetBrains\\PyCharm 2020.1.1\\plugins\\python\\helpers\\pycharm_display', 'PYTHONUNBUFFERED': '1', 'SESSIONNAME': 'Console', 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\\Windows', 'TEMP': 'C:\\Users\\Martin\\AppData\\Local\\Temp', 'TMP': 'C:\\Users\\Martin\\AppData\\Local\\Temp', 'USERDOMAIN': 'LYH', 'USERDOMAIN_ROAMINGPROFILE': 'LYH', 'USERNAME': 'Martin', 'USERPROFILE': 'C:\\Users\\Martin', 'VBOX_MSI_INSTALL_PATH': 'D:\\VirtualBox\\', 'WINDIR': 'C:\\Windows'})
D:\Code\Python\PythonStudy\Day5
part1\part2
('./test', 'file.txt')
('./test/file', '.txt')
Process finished with exit code 0
序列化
我们把变量从内存中变成可存储或传输的过程称之为序列化
序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上
反过来,把变量从序列化对象重新读到内存里称之为反序列化
"""
序列化
"""
import pickle
d = {
'name': 'Sam',
'age': 20,
'score': 100
}
print(pickle.dumps(d))
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00Samq\x02X\x03\x00\x00\x00ageq\x03K\x14X\x05\x00\x00\x00scoreq\x04Kdu.'
Process finished with exit code 0
print(pickle.loads(data))
{'name': 'Sam', 'age': 20, 'score': 100}
Process finished with exit code 0
如果我们要在不同编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON
print(json.dumps(d))
{"name": "Sam", "age": 20, "score": 100}
Process finished with exit code 0
dumps方法返回一个str,内容就是标准的JSON
dump方法可以直接把JSON写入文件
loads方法把JSON字符串反序列化
load方法从文件中读取字符串并进行反序列化
eg:用JSON序列化学生对象
"""
用JSON序列化学生对象
"""
import json
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
student = Student("Martin", 20, 100)
print(json.dumps(student, default=lambda obj: obj.__dict__))
{"name": "Martin", "age": 20, "score": 100}
Process finished with exit code 0