小工具      在线工具  汉语词典  css  js  c++  java

python输入输出流IO

Python,python,json 额外说明

收录于:157天前

文件读写

读写文件是最常见的IO操作。 Python 具有用于读取和写入文件的内置函数。

# 读文件

# 要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符:

file = open('file_path', 'r')

# 文件打开成功后,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示
file.read()

# 最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的

file.close()


# 读文件可能战胜IOError,为确保文件正常关闭需要用try...except...finally包裹,并确保关闭

try:
    f = open('/path/to/file', 'r')
    print(f.read())
except(IOError):
    print("open fail")
finally:
    if f:
        f.close()


# 为了方便操作,Python引入了with语句来自动帮我们调用close()方法

with open('file_path', 'r') as f:
    print(f.read())

# 前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。



# read()一次性读取,read(size)每次读取指定大小文件,readlines()每次读取一行,后两个需要多次读取才能获取文件所有内容

读取二进制文件

# 要读取二进制文件,比如图片、视频等等,用'rb'模式打开文件

file = open('path/test.jpg', 'rb')
file.read()

# 和文件读取一样需处理异常

# 读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,来配置编码表

file = open('path/test.txt', 'r', encoding='gbk')
file.read()

写文件

# 写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件



""" 可以反复调用write()来写入文件,但是务必要调用f.close()来关闭文件。 当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。 只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。 忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with语句来操作 """

with open('path/test.txt', 'w') as file:
    file.write('Hello, world!')

StringIO

内存缓冲区、StringIO和BytesIO读取内存数据

# 很多时候,数据读写不一定发生在磁盘上,也可以在内存中读写

# python提供了StringIO和BytesIO读取内存数据
# 写入内存

# 要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可。

from io import StringIO

f = StringIO()
f.write('hello')
f.write(' ')
f.write('world!')

print(f.getvalue())
''' hello world! '''

# getvalue()方法用于获得写入后的str。
hello world!





'\nhello world!\n'
# 内存读取

# 要读取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! '''
Hello!
Hi!
Goodbye!





'\nHello!\nHi!\nGoodbye!\n'
BytesIO
# StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。

# BytesIO用法和StringIO一样

# 写入内存
from io import BytesIO
f = BytesIO()
f.write('中文'.encode('utf-8'))

print(f.getvalue())
b'\xe4\xb8\xad\xe6\x96\x87'
# 内存读取
from io import BytesIO
f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
f.read()
b'\xe4\xb8\xad\xe6\x96\x87'
文件对象

文件对象用于对文件系统进行Python操作

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


# os.name变量用于判断操作系统的类型
import os
os.name # 操作系统类型

# 如果是posix,说明系统是Linux、Unix或Mac OS X,如果是nt,就是Windows系统。
'nt'
操作目录
# 操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中

# 查看、创建和删除目录如下:

# 查看当前目录的绝对路径:
os.path.abspath('.')

# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
os.path.join('path', '文件名')

# 然后创建一个目录:
os.mkdir('path')
# 删掉一个目录:
os.rmdir('path')

当两个路径合二为一时,不要直接拼出字符串,而是使用os.path.join()函数,这样可以正确处理不同操作系统的路径分隔符。

# 在Linux/Unix/Mac下,路径以 / 连接


# 而Windows下路径以 \ 连接

分割路径时,使用 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')
序列化
# 在程序运行的过程中,所有的变量都是在内存中

# 一旦程序结束,变量所占用的内存就被操作系统全部回收。下次重新运行程序,变量又被初始化

# 把变量从内存中变成可存储或传输的过程称之为序列化

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


# Python提供了pickle模块来实现序列化

# pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件。
# 或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object

import pickle
d = dict(name='Bob', age=20, score=88)
# pickle.dumps(d)

f = open('dump.txt', 'wb')
pickle.dump(d, f)
f.close()


# 我们要把对象从磁盘读到内存时,可以先把内容读到一个bytes,然后用pickle.loads()方法反序列化出对象,
# 也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象。

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页面中读取,非常方便。
# Python内置的json模块提供了非常完善的Python对象到JSON格式的转换。

字典转json


# dumps()方法返回一个str,内容就是标准的JSON。类似的,dump()方法可以直接把JSON写入一个file-like Object。

import json
d = dict(name='Bob', age=20, score=88)
json.dumps(d)
#'{"age": 20, "score": 88, "name": "Bob"}'
'{"name": "Bob", "age": 20, "score": 88}'
# json字符串转dict

# JSON反序列化为Python对象,用loads()或者对应的load()方法,前者把JSON的字符串反序列化,后者从file-like Object中读取字符串并反序列化

json_str = '{"age": 20, "score": 88, "name": "Bob"}'
json.loads(json_str)
#{'age': 20, 'score': 88, 'name': 'Bob'}
{'age': 20, 'score': 88, 'name': 'Bob'}
# JSON标准规定JSON编码是UTF-8,所以我们总是能正确地在Python的str与JSON的字符串之间转换

类转json

# Python的dict对象可以直接序列化为JSON的{},class的实例对象都无法直接序列化为JSON

# class实例化对象转化为dict后再转为json
class Student(object):
    __name=None
    __age=None
    def __init__(self,name,age):
        self.__name=name
        self.__age=age
    def getName(self):
        return self.__name
    def getAge(self):
        return self.__age
def class_to_dict(object):
    return {
    
        'name':object.getName(),
        'age':object.getAge()
    }
student=Student('zhansna',20)
print(student)
student_to_dict=class_to_dict(student)
print(student_to_dict)
<__main__.Student object at 0x000001B5BC10A160>
{'name': 'zhansna', 'age': 20}
# 将类转化的dict再转化为json
student_to_json=json.dumps(student_to_dict)
print("转化前:",type(student_to_dict))
print(student_to_json)
print("转化后:",type(student_to_json))
转化前: <class 'dict'>
{"name": "zhansna", "age": 20}
转化后: <class 'str'>
# 为了减少变量的定义,json.dumps()方法有一个default参数定义class转化dict规则
student_json=json.dumps(Student("lihua",20),default=class_to_dict)
print(student_json)
{"name": "lihua", "age": 20}
# 但是这样对与每个class都要编写转化函数,class对象提供了一个__dict__变量用来存储实例变量

print(student.__dict__)
{'_Student__name': 'zhansna', '_Student__age': 20}
# 有了__dict__属性就可以直接转换
s1=Student("lisa",20)
student1_json=json.dumps(s1,default=lambda s:s.__dict__)
print(student1_json)
{"_Student__name": "lisa", "_Student__age": 20}
# JSON反序列化为一个Student对象实例,loads()方法首先转换出一个dict对象

# 再编写方法将dict转化为class

# json模块的dumps()和loads()函数是定义得非常好的接口的典范。自定义default转化规则就可以将任意类型转化为json
. . .

相关推荐

额外说明

用stream连接rabbitmq

        <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sta

额外说明

Java基本数据类型包装类和转义字符及类型转换

##一、Java基本数据类型包装类和转义字符 1.Java每个基本类型在java.lang包中都有一个相应的包装类 2.包装类作用: (1). 提供了一系列实用的方法 (2). 集合不允许存放基本数据类型数据,存放数字时,要用包装类型 ().包装类提供了

额外说明

使用拦截器验证session是否为空

第一步、定义一个拦截器: public class UserInterceptor extends AbstractInterceptor { private static String AUTH_SESSION_USER_KEY="userInfo"

额外说明

Linux下使用zip命令加密/解压文件zip、unzip、unar

Linux下使用zip命令加密压缩/解压文件 一、zip命令加密压缩解压 二、zip命令参数 一、zip命令加密压缩解压 压缩方法一 zip -re *.zip files1 files2 压缩 压缩方法二 zip -q -r -P passwordd

额外说明

渗透环境——Java SE Development Kit 8u271

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技am

额外说明

go import package 引用本地搭建的gitlab的私有包

起因 项目依据不同的逻辑,拆分成了多个公用模块,例如:处理通用功能的模块(common),常量定义模块(constant)等。由于多个项目都需要用到这些公用模块,合作开发时,使用go modules,引用公用包的时候,像这样replace common

额外说明

【Python 基础篇】Python数据序列推导式

文章目录 前言 一、列表推导式 二、字典推导式 三、集合推导式 总结 前言 在Python中,推导式(Comprehension)是一种简洁而强大的语法,用于快速创建列表、字典和集合。推导式使得在一个简单的语句中就能生成一个新的数据结构,而不需要显式地编

额外说明

距离度量 —— 汉明距离(Hamming Distance)

Python学习系列文章:- 目录 - 文章目录 一、概述 二、计算方式 三、汉明重量 一、概述 汉明距离(Hamming Distance),就是将一个字符串变成另一个字符串所需要的替换次数。 二、计算方式 举个例子, 1011101 与 100100

额外说明

IE6/IE7和Firefox对Div处理的差异

基本HTML代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dt

额外说明

构造函数的理解

  public   partial   class  Override_Default : System.Web.UI.Page ... {     protected void Page_Load(object sender, EventArgs e

ads via 小工具