漫天飞雪

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
内容:
文件处理

文件处理概念
#coding:utf-8
'''
1 什么是文件
文件是操作系统为用户/应用程序提供的一种操作硬盘的抽象单位
2 为何要用文件
用户/应用程序对文件的读写操作会由操作系统转换成具体的硬盘操作
所以用户/应用程序可以通过简单的读\写文件来间接地控制复杂的硬盘的存取操作
实现将内存中的数据永久保存到硬盘中
user=input('>>>>: ') #user="egon"
3 如何用文件
文件操作的基本步骤:
f=open(...) #打开文件,拿到一个文件对象f,f就相当于一个遥控器,可以向操作系统发送指令
f.read() # 读写文件,向操作系统发送读写文件指令
f.close() # 关闭文件,回收操作系统的资源
上下文管理:
with open(...) as f: #f是类似变量名,是打开文件的一种变量显示,自己定义,因为接下来是用于一些内置方法。
pass
'''

# open(r'D:\SH_fullstack_s3\day07\a.txt')
# f=open(r'a.txt',encoding='utf-8') #向操作系统发送请求,要求操作系统打开文件
# print(f) # f的值是一个文件对象
# print(f.read())

# f.close() # 向操作系统发送请求,要求操作系统关闭打开的文件
# print(f)
# f.read()

# 强调:一定要在程序结束前关闭打开的文件


# 上下文管理with
with open(r'a.txt',encoding='utf-8') as f,\
open('b.txt',encoding='utf-8') as f1:
print(f.read())
print(f1.read())

文件处理的详细操作
'''
一 文件的打开模式
r: 只读模式L(默认的)
w: 只写模式
a: 只追加写模式

二 控制读写文件单位的方式(必须与r\w\a连用)
t : 文本模式(默认的),一定要指定encoding参数
优点: 操作系统会将硬盘中二进制数字解码成unicode然后返回
强调:只针对文本文件有效

b: 二进制模式,一定不能指定encoding参数
优点:直接读取不需要进行编码

'''
#
# with open('a.txt',mode='rt',encoding='utf-8') as f:
# data=f.read()
# print(data,type(data))


# with open('1.png',mode='rt',encoding='utf-8') as f:
# data=f.read()

# with open('1.png',mode='rb',) as f:
# data=f.read()
# print(data,type(data))

# with open('a.txt',mode='rb',) as f:
# data=f.read()
# # print(data,type(data))
# print(data.decode('utf-8'))

# with open('a.txt',mode='rt',encoding='utf-8') as f:
# data=f.read()
# print(data)


#一 r: 只读模式L(默认的)
# 1 当文件不存时,会报错
# 2 当文件存在时,文件指针指向文件的开头

# with open('a.txt',mode='rt',encoding='utf-8') as f:
# res1=f.read()
# print('111===>',res1)
# res2=f.read()
# print('222===>',res2)

# print(f.read())
# print(f.readable())
# print(f.writable())
# print(f.readline())
# print(f.readline())

# for line in f:
# print(line)

# l=[]
# for line in f:
# l.append(line)
# print(l)
# print(f.readlines())

# 二 w: 只写模式


# 三 a: 只追加写模式
# 1 当文件不存时,新建一个空文档,文件指针跑到文件的末尾
# 2 当文件存在时,文件指针跑到文件的末尾

# with open('c.txt',mode='at',encoding='utf-8') as f:
# print(f.readable())
# print(f.writable())
# f.read()

# f.write('虎老师:123\n')


# 在文件打开不关闭的情况下,连续的写入,下一次写入一定是基于上一次写入指针的位置而继续的
# with open('d.txt',mode='wt',encoding='utf-8') as f:
# f.write('虎老师1:123\n')
# f.write('虎老师2:123\n')
# f.write('虎老师3:123\n')

# with open('d.txt',mode='wt',encoding='utf-8') as f:
# f.write('虎老师4:123\n')



# with open('d.txt',mode='at',encoding='utf-8') as f:
# f.write('虎老师1:123\n')
# f.write('虎老师2:123\n')
# f.write('虎老师3:123\n')
with open('d.txt',mode='at',encoding='utf-8') as f:
f.write('虎老师4:123\n')

文件处理的读写操作
# x = "上"
#
# res=x.encode('utf-8')
# print(res,type(res))
#
#
# # bytes
#
# name=input(">>>:") # name="林xxx"


# f=open(r'今日内容',mode='rt',encoding='utf-8')
# msg=f.read()
# print(type(msg))
#
# f.close()
#
# f=open(r'a.txt',mode='wt',encoding='utf-8')
# f.write('你好') # "你好"(unicode格式的二进制) --- > utf-8格式的二进制(bytes)
# f.close()


# f=open(r'b.txt',mode='wb')
# f.write('你好'.encode('gbk'))
# f.close()

# f=open(r'b.txt',mode='rb')
# msg=f.read()
# print(type(msg))
# print(type(msg.decode('gbk')))
# f.close()

f=open(r'b.txt',mode='wt',encoding='utf-8')
# f.write('aaa\n')
# f.write('bbb\n')
# f.write('ccc\n')
f.write('ddd\n')
f.close()
文件处理的可读可写操作
# 可读可写:
# r+t

# w+t

# a+t

with open('a.txt',mode='r+t',encoding='utf-8') as f:
# print(f.readable())
# print(f.writable())
msg=f.readline()
print(msg)
f.write('xxxxxxxxxxx\n')

1 控制文件内指针的移动
f.seek()
f.tell()
f.read(n)
f.truncate(n)

# f.seek
# 文件内指针移动,只有t模式下的read(n),n代表的字符的个数
# 除此以外文件内指针的移动都是以字节为单位
# with open('a.txt',mode='rt',encoding='utf-8') as f:
# msg=f.read(1)
# print(msg)

# with open('a.txt',mode='rb') as f:
# msg=f.read(3)
# print(msg.decode('utf-8'))


# f.seek(offset,whence)有两个参数:
# offset: 代表控制指针移动的字节数
# whence: 代表参照什么位置进行移动
# whence = 0: 参照文件开头(默认的),特殊???,可以在t和b模式下使用
# whence = 1: 参照当前所在的位置,必须在b模式下用
# whence = 2: 参照文件末尾,必须在b模式下用

# with open('a.txt',mode='rt',encoding='utf-8') as f:
# f.seek(6,0)
# msg=f.read(1)
# print(msg)

# with open('a.txt',mode='rb') as f:
# f.seek(3,0)
# msg=f.read(3)
# print(msg.decode('utf-8'))

# with open('a.txt',mode='rb') as f:
# msg=f.read(3)
# # print(msg.decode('utf-8'))
# print(f.tell())
# # f.seek(6,0)
# f.seek(3,1)
# msg1=f.read(3)
# print(msg1.decode('utf-8'))


# with open('a.txt',mode='rb') as f:
# msg=f.read(3)
# # print(msg.decode('utf-8'))
# print(f.tell())
# # f.seek(6,0)
# f.seek(3,1)
# msg1=f.read(3)
# print(msg1.decode('utf-8'))


# with open('a.txt',mode='rb') as f:
# # f.seek(0,2)
# # print(f.tell())
# f.seek(-3,2)
# msg=f.read(3)
# print(msg.decode('utf-8'))



# with open('access.log',mode='rb') as f:
# f.seek(0,2) # 当前位置是147bytes
#
# while True:
# line=f.readline() # 当前位置是196bytes
# # print(f.tell())
# if len(line) == 0:
# # 没有新的一行内容追加进来
# pass
# else:
# # 有新的一行内容追加进来
# print(line.decode('utf-8'),end='')


# with open('access.log',mode='rb') as f:
# f.seek(0,2) # 当前位置是147bytes
#
# while True:
# line=f.readline() # 当前位置是196bytes
# if len(line) != 0:
# print(line.decode('utf-8'),end='')

with open('a.txt',mode='r+t',encoding='utf-8') as f:
f.truncate(6)

2 修改文件的两种方式
# with open('c.txt','r+t',encoding='utf-8') as f:
# f.seek(13,0)
# # f.write('在老男孩')
# f.write('h')

# 修改文件的方式一:
# 1 将文件内容由硬盘全部读入内存
# 2 在内存中完成修改
# 3 将内存中修改后的结果覆盖写回硬盘

# 正确的做法
# with open('d.txt',mode='rt',encoding='utf-8') as f:
# all_data=f.read()

# print(all_data,type(all_data))

# with open('d.txt',mode='wt',encoding='utf-8') as f:
# f.write(all_data.replace('alex','dsb'))


# 错误的做法
# with open('d.txt',mode='rt',encoding='utf-8') as f1,open('d.txt',mode='wt',encoding='utf-8') as f2:
# all_data=f1.read()
# f2.write(all_data.replace('dsb','alex'))



# 修改文件的方式二:
# 1 以读的方式打开源文件,以写的方式打开一个临时文件
# 2 从源文件中每读一样内容修改完毕后写入临时文件,直到源文件读取完毕
# 3 删掉源文件,将临时文件重命名为源文件名
# import os
#
# with open('d.txt',mode='rt',encoding='utf-8') as read_f,open('.d.txt.swap',mode='wt',encoding='utf-8') as write_f:
# for line in read_f:
# write_f.write(line.replace('alex','dsb'))
#
# os.remove('d.txt')
# os.rename('.d.txt.swap','d.txt')

# 方式一:
# 优点: 在文件修改的过程中硬盘上始终一份数据
# 缺点: 占用内存过多,不适用于大文件


# 方式二:
# 优点: 同一时刻在内存中只存在源文件的一行内容,不会过多地占用内存
# 缺点: 在文件修改的过程中会出现源文件与临时文件共存,硬盘上同一时刻会有两份数据,即在修改的过程中会过多的占用硬盘,

3 函数相关
函数的定义
1 什么是函数
函数就是具备某一功能的工具


2 为什么要用函数
1 程序的组织结构不清晰,可读性差
2 代码冗余
3 可扩展性差

3 如何用函数
函数的使用必须遵循的原则:先定义,后调用
修理工事先准备工具的过程即函数的定义
修理工遇到应用场景拿来工具就用即函数的调用

语法:
def 函数名(参数1,参数2,...):
"""
文档注释
"""
code1
code2
code3
......
return 返回值

def:定义函数的关键字
函数名: 就相当于一个变量名,指向函数的内存地址,
注意:函数的内存地址()就可以出发函数体代码的执行

参数: 参数是函数的调用者为函数体代码传值的媒介,在python中函数的参数无需声明类型
"""文档注释""" : 推荐写上
代码块:就是函数体功能的具体实现
return 返回值 :函数体代码块运行的成果


函数的使用分为两个阶段:
定义阶段: 只检测语法,不执行代码
调用阶段:运行函数体代码
def foo():
xxx
print(

函数的调用
函数的返回值
函数的参数

# 先定义
# def foo():
# print("from foo")

# 后调用
# print(foo)
# foo() # 定义时无参,意味着调用时也无需传入参数

# 先定义
# def bar(x,y):
# print(x)
# print(y)
# 后调用
# bar('a',2) ## 定义时无参,意味着调用时也必须传入参数


# 定义无参函数:当函数体的代码逻辑不依赖任何传入的值就能执行,就不需要定义参数
# def print_msg():
# print('='*50)
# print('welecome.....'.center(50,' '))
# print('='*50)
#
# print_msg()
# print_msg()



#定义有参函数:当函数体的代码逻辑依赖于外部调用者传入的值才能执行,必须定义参数用来接收外部传入的值
# def max2(x,y):
# # x=1
# # y=3
# if x > y:
# print(x)
# else:
# print(y)
# max2(1,4)


# def max2(x,y):
# if x > y:
# return x
# else:
# return y
# res=max2(1,4)
# print(res)


# def foo():
# print('from foo')
# bar()
# foo()

# def bar():
# print('from bar')
#
# def foo():
# print('from foo')
# bar()
# foo()


# # 定义阶段
# def foo():
# print('from foo')
# bar()
#
# def bar():
# print('from bar')
#
# # 调用阶段
# foo()


# 定义阶段
def foo():
print('from foo')
bar()

# 调用阶段
foo()

def bar():
print('from bar')




posted on 2018-07-28 14:45  漫天飞雪世情难却  阅读(92)  评论(0编辑  收藏  举报