跟文件操作有关的模块: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()
例:压缩备份文件夹:
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')
二 、 序列化对象 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()
三、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格式的字典或列表(解码)
四、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,创建一个对象 # 迭代对象迭代结束后就不能再继续迭代了

浙公网安备 33010602011771号