Python IO - 操作

Python IO - 操作

1. 输出 print

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

参数:

  • objects 输出对象。输出多个对象时,需要用 , 分隔。
  • sep 默认为空格;多个对象的间隔
  • end 默认为换行符 \n;输出的结尾
  • file 要写入的文件对象
  • flush bool 类型;是否被缓存通常决定于 file
    • 如果 flush=True,流会被强制刷新。具体来说,每次执行的 print 都会写入并刷新 file 的内容
    • 如果 flush=False,只有在 f.close() 执行后,print 的内容才会写入 file

实例

# Example 1
print("good", "morning", sep="-")
# Output: good-morning

# Example 2: Loading 效果
import time
print("Loading", end="")
for i in range(20):
    print(".", end="", flush=True)
    time.sleep(0.5)
# Output: Loading....................

2. pprint 库,美化输出

方式 1:直接使用函数方法:

# Print object
pprint.pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False)
# 返回一个格式化的字符串,不会 print,
pprint.pformat(object, indent=1, width=80, depth=None, *, compact=False)

方式 2:使用类方方式:

pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False)
PrettyPrinter.pprint(object)
PrettyPrinter.pformat(object)

主要参数

  • stream:输出流,默认是 sys.stdout,也就是屏幕输出。
  • indent:缩进空格数。
  • width:每行最大宽度,默认为 80 个字符。超过宽度会换行,但如果单个对象超过不会被换行,比如一段长字符串。
  • depth:限制数据的层级,设置后可以限制过多的嵌套。
  • compact:若设为 True ,则输出会在接近 width 限制才进行换行。

实例

import pprint
info = {'class': [{'name': 'ZM', 'grades': [90, 91]},
                  {'name': 'XX', 'grades': [85, 87]} ] }
# print 方法
print(info)
# Output: {'class': [{'name': 'ZM', 'grades': [90, 91]}, {'name': 'XX', 'grades': [85, 87]}]}

# 方式 1:
pprint.pprint(info)
info_p = pprint.pformat(info)  # 获取美化的字符串
# 方式 2:
pp = pprint.PrettyPrinter()
pp.pprint(info)
info_p = pp.pformat(info)  # 获取美化的字符串
# Output: {'class': [{'grades': [90, 91], 'name': 'ZM'},
# Output:            {'grades': [85, 87], 'name': 'XX'}]}

2.1 第三方库 beeprint

beeprint:对 print 内容进一步美化,Github

3. 第三方库 PrettyTable 美化表格输出

参考资料

PrettyTable 教程, site

4. 读写文件

open(file, mode='r', encoding=None)

主要参数:

  • file:文件路径
  • mode:读写模型
  • encoding:编码格式

mode 读写模式含义,具体参考 website

  • 总结: r 表示读; w 表示覆盖写入;b 表示二进制模式;a 表示文件末尾追加写入;+ 可读可写
  • rrb:只读;文本模式,二进制模式
  • r+rb+:读写;文本模式,二进制模式
  • wwb:只写;文本模式,二进制模式。如果文件存在,则覆盖;如果文件不存在,则新建。
  • w+wb+:读写;文本模式,二进制模式
  • aab:追加只写,文本模式,二进制模式。如果文件存在,则覆盖;如果文件不存在,则新建。
  • a+ab+:追加读写,文本模式,二进制模式

主要函数:

file.read([size]):返回 str 类型;默认读取所有

  • 读取指定的 size 字符数(对于二进制模型,size 表示字节数)。

file.readline([size]):返回 str 类型;默认读取一整行。

  • 读取一行的前 size 字符数,最多为一行,包括换行 \n 字符

file.readlines([sizeint]):返回 list 类型,每个元素为一行内容,包括换行 \n 字符;默认读取所有行数

  • 读取 sizeint 字符数的行数

file.write(str):返回的写入的字符长度

  • 将字符串写入文件,如果需要换行,则需要在元素后添加换行 \n 符号

file.writelines(sequence):无返回值,

  • 将一个序列(list 类型,或 tuple 类型)字符串写入文件。如果需要换行,则需要自行在每个元素后添加换行 \n 符号

file.flush()

  • 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件

注意:

  • 上述函数不会自行处理换行符 \n:读取一行的时候,最后一个字符为换行符;写入一行的时候,需要自行添加换行符。

实例:两种等价的文件读写方式

# 方式一:推荐方式
with open('test_1.txt', 'w', encoding='utf-8') as f:
    f.write('1234567')
# 方式二:
f = open('test_2.txt', 'w', encoding='utf-8')
f.write('1234567')
f.close()  # 注意关闭文件

5. 读写压缩文件 zipfile

zipfile 库,用于处理压缩包,官方文档

5.1 zipfile.ZipFile() 对象

主要参数

  • file:文件路径

  • mode:操作方式,默认 mode='r'

    • r:读取,
    • w:截取,写入
    • a:追加
    • x:创建新文件

主要方法

ZipFile.getinfo(name):获取指定文件 name 的信息

ZipFile.infolist():获取全部文件的信息

ZipFile.namelist():获取全部文件的路径

ZipFile.close():关闭文件

ZipFile.setpassword(pwd):设置压缩文件密码,执行解压操作需要的密码

ZipFile.extract(member, path=None, pwd=None):提取某个文件

  • 参数:
    • member: str 类型;待解压文件的路径
    • path:str 类型;本地保存路径
    • pwd:str 类型;密码

ZipFile.extractall(path=None, members=None, pwd=None)

  • 参数:
    • path:str 类型;本地保存路径
    • members: list 类型;待解压文件的路径合集。默认为 None,表示解压全部文件
    • pwd:str 类型;密码

注意ZipFile.extract()ZipFile.extractall() 方法,

  • 如果保存的路径不存在,会自动创建文件夹
  • 如果本地文件存在重名,则会自动覆盖

实例 1:解压文件

import zipfile

# 压缩文件目录
# test/ 
# test/folder/
# test/folder/test_1.txt 
# test/folder/test_2.txt
# test/test.txt

test_file = 'test/test.txt' # 带解压文件
with zipfile.ZipFile('test.zip', 'r') as z:
    print(z.infolist())
    print(z.namelist())
    print(z.getinfo(test_file))
    
    z.extract(test_file, 'extracted_folder')  # 单独提取某个文件
    z.extractall('extracted_folder')          # 提取所有文件

ZipFile.read(name, pwd=None):以二进制(byte)的形式读取某个文件

  • 如果 name 为文本文件,并且知道编码方式,通过 ZipFile.read(name).decode("utf-8") 可以返回文本文件的内容:

ZipFile.open(name, mode='r', pwd=None):以二进制(byte)的形式打开某个文件:

  • 参数:modemode='r' 读; mode='w' 写。

实例 2:读取压缩文件中的某个文件

import zipfile
test_file = 'test/test.txt'
with zipfile.ZipFile('test.zip', 'r') as z:

    # 方式 1:使用 ZipFile.open()
    with z.open(test_file, 'r') as f:
        s = f.read()            # 读取文件,返回二进制形式
        s = s.decode("utf-8")   # 二进制形式编码为字符串形式,需要知道文件的编码方式
        print(s)

    # 方式 2:使用 ZipFile.read()
    s = z.read(test_file)  # 读取文件,返回二进制形式
    s = s.decode("utf-8")  # 二进制形式编码为字符串形式,需要知道文件的编码方式
    print(s)
def read_csv_from_zip(path):
    from io import StringIO
    [zip_path, data_path] = path.split('!')
    with zipfile.ZipFile(zip_path, 'r') as z:
        s = z.read(data_path)  # 读取文件,返回二进制形式
        s = s.decode("utf-8")  # 二进制形式编码为字符串形式,需要知道文件的编码方式
    data = pd.read_csv(StringIO(s))
    return data

实例 3:压缩文件夹

import os
import zipfile

def file_zip(folder_path, out_file):
    """
    压缩指定文件夹
    Parameters:
        folder_path: 目标文件夹路径
        out_file: 压缩文件保存路径 + xxx.zip
    
    Example:
    file_zip(folder_path = 'file/data', out_file = 'file/data.zip')
    """
    zip = zipfile.ZipFile(out_file, "w", zipfile.ZIP_DEFLATED)

    for path, dirnames, filenames in os.walk(folder_path):
        fpath = path.replace(folder_path, '')
        for filename in filenames:
            zip.write(os.path.join(path, filename), os.path.join(fpath, filename))

    return None

参考资料

RUNOOB, Python 文件I/O, website

posted @ 2022-05-21 16:49  veager  阅读(51)  评论(0编辑  收藏  举报