Python编程——IO编程

文件读写

f = open('example.txt', 'r') # 错误返回IOError,可选参数encoding='utf-8',errors='ignore'
f.read() # str 一次读取文件的全部内容,可以给定参数size,读取size个字节内容
f.close() # 关闭文件

# 自动调用close
with open('example.txt', 'r') as f:
    f.read()

f.readline() # 每次读取一行
f.readlines() # 一次读取文件的全部内容,并按行返回list(常用于读取配置文件)
f.read().splitlines() # 同f.readlines(),但不会保留换行

f.write('string') # 参数'a'为追加模式
f.writelines([str]) # 写入字符串序列,如list,需要自己加入换行

CSV

import csv
# 写入CSV文件
with open('data.csv','w',encoding='utf-8',newline='') as csvfile: # 给定newline参数,默认为空行
    writer = csv.writer(csvfile,delimiter=' ')  # delimiter为列的分隔符
    writer.writerow([]) # 列表
    writer.writerows([[],[],[]]) # 二维列表

    # 写入字典
    fieldnames = ['id','name','age']
    writer = csv.DictWriter(csvfile,fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow(dict)

# 读取CSV文件
with open('data.csv','r',encoding='utf-8') as csvfile:
    reader =csv.reader(csvfile)
    for row in reader:
        print(row)

    #读字典
    reader = csv.reader(csvfile)
    fieldnames = next(reader)
    reader = csv.DictReader(csvfile,fieldnames=fieldnames) 
    for row in reader:
        a_dict={}
        for key,value in row.items():
            a_dict[key]=value

# 使用pandas读取CSV
import pandas as pd
df = pd.read_csv('data.csv')
print(df)

StringIO

from io import StringIO
f = StringIO()
f.write('hello') # 在内存中写str
f.getvalue() # 获取写入后的str

BytesIO用于操作二进制数据

操作文件和目录

import os
os.name # nt为windows
os.uname() # 详细系统信息,不支持windows
os.environ # 操作环境变量
os.environ.get('PATH')

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

# 可以正确处理不同操作系统的路径分隔符
os.path.join('/Users/michael', 'testdir')
os.path.split('/Users/michael/testdir/file.txt') # 后一部分为最后级别的目录或文件名
os.path.splitext('/path/to/file.txt') # 后一部分为文件拓展名

os.mkdir('/Users/michael/testdir')
os.rmdir('/Users/michael/testdir')
os.rename('test.txt', 'test.py')
os.remove('test.py')
os.listdir('dirname') # 列出指定目录下的所有文件和子目录,包括隐藏文件,返回list

[x for x in os.listdir('.') if os.path.isdir(x)] # 当前目录下所有目录
[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py'] # 列出所有py文件

序列化(pickling, json)

pickling

import pickle
# 1.序列化为bytes
xxx = pickle.dumps(xxx) 
xxx = pickle.loads(xxx)  # 反序列化

# 2.序列化为file-like object
with open('dump.txt','wb') as file: 
    pickle.dump(xxx,file) 

with open('dump.txt','rb') as file: 
    xxx = pickle.load(file) # 反序列化

json

import json
json.dumps(xxx) # 返回标准json str 类似的,dump()可以将json写入file-like object
json.loads(xxx) # json字符串反序列化,load()同理

配置default参数:把任意一个对象变成一个可序列为JSON的对象

def student2dict(std):
    return {
        'name': std.name,
        'age': std.age,
        'score': std.score
    }

json_str = json.dumps(s, default=student2dict)

# 将类实例属性-值转化为字典
json.dumps(s, default=lambda obj: obj.__dict__)

def dict2student(d):
    return Student(d['name'], d['age'], d['score'])
s = json.loads(json_str, object_hook=dict2student)

发表评论