跟文件操作有关的模块:zipfile ,pickle,shelve,json,csv

一、zipfile

import zipfile
# 1 解压缩
# 获取压缩文件
zip = zipfile.ZipFile('F:\sis001.zip', mode='r')  # 默认值就是r
print(zip)  # <zipfile.ZipFile filename='F:\\sis001.zip' mode='r'>

# 文件信息列表
print(zip.filelist)  # [<ZipInfo filename='sis001.exe' comp...

# 文件名列表  怎么解决文件名中文乱码问题
print(zip.namelist())  # ['sis001.exe', '╣╪╙┌sis001╚φ╝■▒╗╬≤▒¿▓í╢╛╡─╦╡├≈.txt']
# filename.encode('cp437').decode('gbk') # 可以解决乱码,具体怎么操作我还不会
# 获取单个文件信息
print(zip.getinfo('sis001.exe'))  # <ZipInfo filename='sis001.exe' compress_type=deflate external_attr=0x20 file_size=233472 compress_size=112251>
print(zip.filelist[0])  # <ZipInfo filename='sis001.exe' compress_type=deflate external_attr=0x20 file_size=233472 compress_size=112251>
# 所以:zip.filelist[0] == zip.getinfo(zip.namelist()[0]

# 解压文件
zip.extractall('F:\\aaa')  # 解压到指定文件夹
zip.extract('sis001.exe', 'F:\\aaa')  # 解压单个文件

# 关闭压缩文件
zip.close()

# ------------------------------------------
# 2、压缩
# mode = 'w' 覆盖原来的文件, mode ='a' 添加到原来的压缩文件(没有文件创建一个新文件)
newZ = zipfile.ZipFile('F:\\new.zip', mode='w')  #
newZ.setpassword('tangjun112'.encode())  # 为什么设置密码无效  这是给加密文件解压时用的
print(newZ.write('F:\\114.MP3'))  # 文件和文件夹不可以同时压缩,只能分别压缩,见下面的例:
newZ.close()
View Code

 

 例:压缩备份文件夹:

def backupToZip(folder):
    os.chdir('backup')
    folder = os.path.abspath(folder)
    number = 1
    while True:
        # 循环的作用是产生一个新的文件名
        zipFilename = os.path.basename(folder) + '_' + str(number) + '.zip'
        if not os.path.exists(zipFilename):
            backupZip = zipfile.ZipFile(zipFilename, 'w')
            break
        number += 1

    for foldername, subfolders, filenames in os.walk(folder):
        # os.walk()将返回一个generator:生成器
        # 文件夹名,子文件夹名,文件名
        print(foldername)  # F:\aab\新建文件夹\111
        backupZip.write(foldername)
        for filename in filenames:
            backupZip.write(os.path.join(foldername, filename))


    backupZip.close()
    print('Done.')

backupToZip('F:\\aab')
View Code

 

 

二 、 序列化对象 pickle和shelve

# 方法一
import pickle

li = [1, 2, 3, 4]
dt = {'a': 123, 'b': 234, 'c': '你好'}
with open('a.pkl', 'wb') as f:
    pickle.dump(li, f)
    pickle.dump(dt, f)

# 使用pickle模块从文件中重构python对象
with open('a.pkl', 'rb') as ff:
    data1 = pickle.load(ff)
    print(data1)

    data2 = pickle.load(ff)
    print(data2["c"])

# 方法二

import shelve


class A:
    def __init__(self):
        self.name = 'tnajgun'


s = shelve.open("aaa\\file")
#
s['k'] = A() # 写入数据,会在aaa文件夹下生成file.bak file.dat file.dir三个文件
#
print(s['k'].name)  # 要先写入了才能读,如果已经有数据可以不用写入,
s.close()
View Code

 

 三、json

import json
# json就是java object notation 即:java对象符号,因为网上好多数据都是以这种格式传输的
# 比如,向mysql写入(读取)的数据都是json格式
# 字典转json(编码)
dic = {'name': 'tangjun', 'age': 43, 'sex': True, 'home': None, 'likes': ('唱歌', '跳舞', '看电影')}
jsons = json.dumps(dic)
print(dic)  # {'name': 'tangjun', 'age': 43, 'sex': True, 'home': None, 'likes': ('唱歌', '跳舞', '看电影')}
print(jsons)  # {"name": "tangjun", "age": 43, "sex": true, "home": null, "likes": ["\u5531\u6b4c", "\u8df3\u821e", "\u770b\u7535\u5f71"]}
print(type(jsons))  # <class 'str'>
# 说明:
# 编码以后的结果是一个java格式字符串,True变成true,None变成null,tuple变成java数组
# 从上面结果可以看到,一个汉字点用两个字节,所以是gbk编码,如果要使用utf-8编码则:
# jsons = json.dumps(dic, ensure_ascii=False).encode('utf-8')

jsons = json.dumps(dic, indent=4)
print(jsons)
# {
#     "name": "tangjun",
#     "age": 43,
#     "sex": true,
#     "home": null,
#     "likes": [
#         "\u5531\u6b4c",
#         "\u8df3\u821e",
#         "\u770b\u7535\u5f71"
#     ]
# }

# json转字典(解码)
dic = json.loads(jsons)
# loads是load string的缩写,参数必须是一个json规范的string
print(dic)  # {'name': 'tangjun', 'age': 43, 'sex': True, 'home': None, 'likes': ['唱歌', '跳舞', '看电影']}
print(type(dic))  # <class 'dict'>

# json还可以编码解码list对象,这个功能用途就大了
# 比如:从mysql加载一个table,可以用[{},{}]用这种格式返回数据给客户端,
# 客户端读取json数据后再解析成list和dist
lis = [{'name': 'tangjun', 'sex': True},
       {'name': 'xiaoodn', 'sex': False}]
jsons = json.dumps(lis, indent=4)
print(jsons)  # [{"name": "tangjun", "sex": true}, {"name": "xiaoodn", "sex": false}]
print(type(jsons))  # <class 'str'>
lis = json.loads(jsons)
print(lis)  # [{'name': 'tangjun', 'sex': True}, {'name': 'xiaoodn', 'sex': False}]
print(type(lis))  # <class 'list'>

# 文件操作
# 方法一:
# 保存文件
file = open('a.json', 'w') # 打开一个w模式的文件
json.dump(jsons, file)  # 把 jsons写入文件
file.close()

# 读取文件
file = open('a.json', 'r')  # 打开一个r模式的文件
jsons = json.load(file)
dic = json.loads(jsons)
print(dic)
file.close()


# 方法二
# 保存文件
file = open('b.json', 'w') # 打开一个w模式的文件
file.write(jsons)
file.close()

# 读取文件
file = open('b.json', 'r')  # 打开一个r模式的文件
jsons = file.read()
dic = json.loads(jsons)
print(dic)
file.close()
# 同上,不可以用file.read()方法加载文件

# 后续:关于dump,dumps,load,loads
# dump是保存到文件
# load是从文件加载
#
# dumps是 dump string的缩写,意思是把python格式转成json格式的字符串(编码)
# loads是 load string的编写,意思是把json字符串转成python格式的字典或列表(解码)
View Code

 

四、csv

import csv
# csv是简化版的电子表格,可以用excel软件打开,它是纯文本格式,多个值之间用  , 逗号隔开,如果一个值内部含有 , 逗号,那么
# 这个值需要用 "" 双引号包围,如果你有功夫的话,其实可以自己解析csv文件的,但是csv模块给我们提供了简易的方法

#
outputFile = open('output.csv', 'w', newline='')  # 注意,如果没有newline这个参数的话,每行数据之间会有一个空行
outputWriter = csv.writer(outputFile)
outputWriter.writerow(['spam', 'eggs', 'bacon', 'ham'])
outputWriter.writerow(['Hello, world!', 'eggs', 'bacon', 'ham'])
outputWriter.writerow([1, 2, 3.141592, 4])
# 一次写入多行:writerows,注意,多了一个s
# outputWriter.writerows([['spam', 'eggs', 'bacon'], ['Hello, world!', 'eggs', 'bacon'], ['1', '2', '3.141592']])
outputFile.close()

#
f = open('output.csv', 'r')
rd = csv.reader(f)
# reader对象可以直接迭代或转换成list
# lis = list(rd)
# 对于大型的 CSV 文件,你需要在一个 for 循环中使用 Reader 对象。这样避免将整个文件一次性装入内存
for row in rd:
    print(rd.line_num, row) # row 是一个list,其中的每一个元素都是str
f.close()
# Reader 对象只能循环遍历一次。要再次读取 CSV 文件,必须调用 csv.reader,创建一个对象
# 迭代对象迭代结束后就不能再继续迭代了
View Code

 

posted @ 2020-10-16 08:20  老谭爱blog  阅读(256)  评论(0)    收藏  举报