python_IO编程

基本概念:input, output,stream
存在问题:输入和接收速度不匹配
解决方法:同步(程序暂停,收到结果继续执行)、异步(回调–好了叫我,轮询—好了没…好了没)
收获新知:编程语言都会把操作系统提供的低级C接口封装起来方便使用

文件读写

读文件
>>> f = open('/Users/michael/test.txt', 'r')
>>> f.read()
'Hello, world!'
>>> f.close()
文件使用完毕,必须关闭,否则会占用资源

由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。为了保证无论是否出错
都能正确地关闭文件,我们可以使用try ... finally来实现:
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())
    
read(size)
readline()每次读取一行
readlines()调用readlines()一次读取所有内容并按行返回list。

读取不同文件改参数即可
读取二进制
>>> f = open('/Users/michael/test.jpg', 'rb')
读取字符编码
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')

写文件
>>> f = open('/Users/michael/test.txt', 'w')
>>> f.write('Hello, world!')
>>> f.close()

使用with
with open('/Users/michael/test.txt', 'w') as f:
    f.write('Hello, world!')

StringIO和BytesIO

StringIO
比如说,这时候,你需要对获取到的数据进行操作,但是你并不想把数据写到本地硬盘上,这时候你就可以
用stringIO

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

亦可使用一个str初始化StringIO
>>> f = StringIO('Hello!\nHi!\nGoodbye!')
BytesIO
StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。

>>> 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。

可以用一个bytes初始化BytesIO
>>> from io import BytesIO
>>> f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
>>> f.read()
b'\xe4\xb8\xad\xe6\x96\x87'

操作文件和目录

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

OS模块
操作文件和目录

>>> import os

os.name # 操作系统类型
os.uname() #获取详细的系统信息
os.environ#获取环境变量
os.environ.get('key')#获取某个环境变量

# 查看当前目录的绝对路径:
>>> 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('/Users/michael/testdir/file.txt')
('/Users/michael/testdir', 'file.txt')
#得到文件扩展名
>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')

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

序列化

序列化
变量从内存中变成可存储或传输的过程
反序列化
把变量内容从序列化的对象重新读到内存里

Python提供了pickle模块来实现序列化。
pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件。
pickle.dump()直接把对象序列化后写入一个file-like Object:
>>> import pickle
>>> d = dict(name='Bob', age=20, score=88)
>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()

可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象
>>> f = open('dump.txt', 'rb')
>>> d = pickle.load(f)
>>> f.close()
>>> d
{'age': 20, 'score': 88, 'name': 'Bob'}


JSON
如果要把序列化搞得更通用、更符合Web标准,就可以使用json模块
把Python对象变成一个JSON
dumps()方法返回一个str,内容就是标准的JSON。类似的,dump()方法可以直接把JSON写入一个file-like Object
要把JSON反序列化为Python对象,用loads()或者对应的load()方法,前者把JSON的字符串反序列化,后者从file-like Object中读取字符串并反序列化:
>>> import json
>>> d = dict(name='Bob', age=20, score=88)
>>> json.dumps(d)
'{"age": 20, "score": 88, "name": "Bob"}'

>>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>> json.loads(json_str)
{'age': 20, 'score': 88, 'name': 'Bob'}

把Student类实例序列化为JSON
需要为Student专门写一个转换函数,再把函数传进去即可:
def student2dict(std):
    return {
        'name': std.name,
        'age': std.age,
        'score': std.score
    }
    
>>> print(json.dumps(s, default=student2dict))
{"age": 20, "name": "Bob", "score": 88}

注意事项

open()函数打开文件路径报错问题

>>> f = open('D:\test.txt','r')
Traceback (most recent call last):
 
  File"<ipython-input-56-6a0acaf613c9>", line 1, in <module>
    f =open('D:\test.txt','r')
 
OSError: [Errno 22] Invalid argument: 'D:\test.txt' 
  • Windows系统文件路径中的斜线符号为’’,python用反斜杠’\’转义字符,所以错误案例中的’\’被用作转义,导致解释器解释文件路径错误。

改正的方法有两种:

  • 第一、将’\’的方向反向为’/’,即文首正确的写法
  • 第二、在含有转义符的字符串前加‘r’表示字符串内按原始含义解释,不做转义处理。(推荐!)
>>> f = open(r'D:\test.txt','r') 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PythonIO编程指的是Python程序对文件、网络等输入输出流的操作。Python提供了多种方式进行IO操作,包括文件读写、网络通信、标准输入输出等。 1. 文件读写 Python中最基本的IO操作就是文件读写。使用Python内置的open函数可以打开一个文件,指定文件名和操作模式(读、写、追加等),然后使用read、write等方法进行读写操作。 例如,以下代码打开文件example.txt,将其中的内容读入到变量content中,并将content输出到控制台: ``` with open('example.txt', 'r') as f: content = f.read() print(content) ``` 2. 网络通信 Python可以通过socket模块进行网络通信。使用socket模块创建一个socket对象,然后调用其connect、send、recv等方法进行网络通信。 例如,以下代码创建一个TCP连接,向远程服务器发送一条消息,然后接收服务器返回的消息并输出到控制台: ``` import socket HOST = '127.0.0.1' PORT = 8000 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) s.sendall(b'Hello, world') data = s.recv(1024) print(f'Received {data.decode()}') ``` 3. 标准输入输出 Python的标准输入输出包括控制台输入输出和文件描述符输入输出。使用input函数可以从控制台读取用户输入,使用print函数可以将输出打印到控制台。 例如,以下代码从控制台读取一个字符串,将其转换为整数并输出到控制台: ``` s = input('Please enter a number: ') n = int(s) print(f'The number is {n}') ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王蒟蒻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值