赞
踩
四个主要步骤: 打开。操作,保存,关闭。
open(file, mode='r', buffering=-1, encoding=None, errors=None,newline=None, closefd=True, opener=None)
如果执行正常,open()函数返回1个文件对象,通过该文件对象可以对文件进行读写操作。如果指定文件不存在、访问权限不够、磁盘空间不足或其他原因导致创建文件对象失败则抛出异常。
当对文件内容操作完以后,一定要关闭文件对象,这样才能保证所做的任何修改都确实被保存到文件中。
f1 = open( 'file1.txt','r' ) # 以读模式打开文件
f1.close()
在实际开发中,读写文件应优先考虑使用上下文管理语句with,关键字with可以自动管理资源,不论因为什么原因(哪怕是代码引发了异常)跳出with块,总能保证文件被正确关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的上下文,常用于文件操作、数据库连接、网络连接、多线程与多进程同步时的锁对象管理等场合。
with open(filename, mode, encoding) as fp:
s ='Hello world\n我永远喜欢鹿乃\nmikudaisuki\n'
with open('sample.txt','w') as fp: #默认使用cp936编码
fp.write(s)
with open('sample.txt') as fp: #默认使用cp936编码
print(fp.read())
with open('sample.txt') as fp: #假设文件采用CP936编码
for line in fp: #文件对象可以直接迭代
print(line)
with open('data.txt','r') as fp:
data = fp.readlines() #读取所有行,存入列表
data = [int(item) for item in data] #列表推导式,转换为数字
data.sort(reverse=True) #降序排序
data = [str(item)+'\n' for item in data] #将结果转换为字符串
with open('data_desc.txt','w') as fp: #将结果写入文件
fp.writelines(data)
with open('sample.txt') as fp:
result = [0,'']
for line in fp:
t = len(line)
if t > result[0]:
result = [t, line]
print(result)
对于二进制文件,不能使用记事本或其他文本编辑软件直接进行正常读写,也不能通过Python的文件对象直接读取和理解二进制文件的内容。必须正确理解二进制文件结构和序列化规则,然后设计正确的反序列化规则,才能准确地理解二进制文件内容。
所谓序列化,简单地说就是把内存中的数据在不丢失其类型信息的情况下转成二进制形式的过程,对象序列化后的数据经过正确的反序列化过程应该能够准确无误地恢复为原来的对象。
# 写入 import pickle data = ("胡桃", 2333, [1, 2, 3]) with open('sample_pickle.dat', 'wb') as f: try: pickle.dump(len(data), f) #要序列化的对象个数 for item in data: pickle.dump(item, f) #序列化数据并写入文件 except: print('写文件异常') # 读取 with open('sample_pickle.dat','rb') as f: n = pickle.load(f) for i in range(n): x = pickle.load(f) #读取并反序列化每个数据 print(x)
import struct
sn = struct.pack('if?', 123, 114.514, True)
s = "胡桃我真的好喜欢你啊!"
# 序列化,i表示整数,f表示实数,?表示逻辑值
# i -> i, f -> 114.514 , ? -> True
with open('sample_struct.dat','wb') as f:
f.write(sn)
f.write(s.encode()) #字符串需要编码为字节串再写入文件
读取
with open('sample_struct.dat','rb') as f:
sn = f.read(9)
n, x, b1 = struct.unpack('if?', sn) #使用指定格式反序列化
print('n=',n,'x=',x, 'b1=', b1)
s = f.read(9).decode()
print('s=', s)
写入
import shelve
zhangsan = {'age':38,'sex':'Male','address':'SDIBT'}
lisi = {'age':40,'sex':'Male','qq':'1234567','tel':'7654321'}
with shelve.open('shelve_test.dat') as fp:
fp['zhangsan'] = zhangsan # 像操作字典一样把数据写入文件
fp['lisi'] = lisi
for i in range(5):
fp[str(i)] = str(i)
读取
with shelve.open('shelve_test.dat') as fp:
print(fp['zhangsan']) #读取并显示文件内容
print(fp['zhangsan']['age'])
print(fp['lisi']['qq'])
print(fp['3'])
结果
{'sex': 'Male','address': 'SDIBT','age': 38}
38
1234567
3
写入
import marshal #导入模块
x = [30, 5.0, [1, 2, 3], (4, 5, 6), {'a': 1, 'b': 2, 'c': 3}, {8, 9, 7}]
with open('test.dat', 'wb') as fp: #创建二进制文件
marshal.dump(len(x), fp) #先写入对象个数
for item in x:
marshal.dump(item,fp) #把列表中的对象依次序列化并写入文件
读取
with open('test.dat','rb') as fp: #打开二进制文件
n = marshal.load(fp) #获取对象个数
for i in range(n):
print(marshal.load(fp)) #反序列化,输出结果
结果
30
5.0
[1, 2, 3]
(4, 5, 6)
{'a': 1,
'b': 2,
'c': 3}
{8, 9, 7}
import openpyxl from openpyxl import Workbook fn = r'f:\test.xlsx' #文件名 wb = Workbook() #创建工作簿 ws = wb.create_sheet(title='你好,世界') #创建工作表 ws['A1'] = '这是第一个单元格' #单元格赋值 ws['B1'] = 3.1415926 wb.save(fn) #保存Excel文件 wb = openpyxl.load_workbook(fn) #打开已有的Excel文件 ws = wb.worksheets[1] #打开指定索引的工作表 print(ws['A1'].value) #读取并输出指定单元格的值ws.append([1,2,3,4,5]) #添加一行数据 ws.merge_cells('F2:F3') #合并单元格 ws['F2'] = "=sum(A2:E2)" #写入公式 for r in range(10,15): for c in range(3,8): ws.cell(row=r, column=c, value=r*c) #写入单元格数据 wb.save(fn)
from openpyxl import Workbook
def main(txtFileName):
new_XlsxFileName = txtFileName[:-3] + 'xlsx'
wb = Workbook()
ws = wb.worksheets[0]
with open(txtFileName) as fp:
for line in fp:
line = line.strip().split(',')
ws.append(line)
wb.save(new_XlsxFileName)
main('test.txt')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。