Python基础-----文件读写与OS

Python基础-----文件读写与OS

文件读写方式

文件:可以做到数据的永久存储,文件以硬盘为载体

  • ‘r’ : 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
  • ‘rb’: 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
  • ‘w’ : 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。打开后,多次写入是不会覆盖前面的内容。
  • ‘wb’: 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。常用于非文本文件如图片等
  • ‘a’ : 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件进行写入
  • ‘+’ : 打开一个文件进行更新**(可读可写)**,需要看前面的主模式,r就是读,当文件不存在时,r+会报错;w就是写,当文件不存在时,建立新文档
  1. 创建文件并写入一句话,写入中文必须要encoding,要不然乱码。默认是CP936,指的是GBK
file = open('test.txt','w',encoding='utf-8')  # 以写入模式创建/打开文件
file.write('Hello World!哈哈')    #写入一句话
file.close()			 # 关闭文件,结束内存占用
  1. 以读的形式打开文件,并打印内容
file = open('test.txt', 'r',encoding='utf-8')    #以读取模式打开文件
content = file.read()           #读取文件里面的内容
print(content)                  #打印内容
file.close()
输出:
Hello World!哈哈
  1. 以追加模式打开文件,并打印内容
#打开刚才创建的文件看看是否生效
file = open('test.txt', 'a',encoding='utf-8')    #以读取模式打开文件
file.write('abc')             
file.close()
文件显示: Hello World!哈哈abc
  1. 以读和二进制模式打开文件,rb
    二进制不需要encoding,需要对binary数据进行utf-8解码
file = open('test.txt', 'rb')
file_data = file.read()
content = file_data.decode('utf-8') #对binary数据进行utf-8解码
print(file_data)

输出:
如果不写第三行,那么输出是b'Hello world',代表byte,二进制
写了第三行,'Hello world'
  1. 以写和二进制模式打开文件,wb
file = open('test.txt', 'wb')
file.write("hello哈哈")
file.close()
报错:TypeError: a bytes-like object is required, not 'str'
这是因为要以二进制输入,所以我们需要对写入的字符串转为二进制,叫编码

正确代码:
file = open('test.txt', 'wb')
content = 'hello哈哈'
content = content.encode('utf-8')
file.write(content)
  1. ab模式,追加二进制
file = open('test.txt','ab')
content= 'haha哈哈'
file_data = content.encode('utf-8')
file.write(file_data)
  1. r+,读写
    写入数据不会先清空数据,会把指定文件中的数据替换成写入的数据,文件中其他数据会保留。 一个汉字占用3个字节,所以需要3个字母替换1个汉字
为了兼容不同操作系统,只要看不到b模式,都要使用encoding
file = open('test.txt','r+',encoding='utf-8')
file.write("a") #写在read前面,就是在字符串头写入,并且是覆盖前面的等同字节的内容
result =file.read()
#file.write("a") #写在read后面,就是在字符串尾写入
print(result)
file.close()

输出:write写在read前面,最后输出只会出现没有被替换的内容
属性描述
file.closed返回true如果文件已被关闭,否则返回false。
file.mode返回被打开文件的访问模式。
file.name返回文件的名称。
file_1=open ('./homework.txt','rb+')
print('文件已经关闭?{}'.format(file_1.closed))
print('文件的访问模式是:{}'.format(file_1.mode))
print('文件的名字是:{}'.format(file_1.name))

输出为:
文件已经关闭?False
文件的访问模式是:rb+
文件的名字是:./homework.txt

文件的不同读取操作

read,readline,readlines,读取文件的操作

file = open("test.txt",'r',encoding='utf-8')
content = file.read(1)
print(content)
file.close()
此时文件中内容是:abc哈哈
输出是:a
更改文件内容为:哈哈
输出是:哈

说明:如果是r模式,读取指定数据的长度,不是按字节,rb就是字节数。
注意:在utf-8格式中,一个汉字占用3个字节,字母和数字占用1个字节

根据指定的文件指针读取数据

file = open("test.txt",'rb')
result = file.tell()  #查看文件指定的位置
print(result)   #输出是0
file.seek(7)  #设置文件指定的位置
print(result) #输出是7

content = file.read()
content.decode("utf-8")
print(content)  #输出为第7个字节后面的内容

file.close()

读取一行数据

file = open("test.txt",'rb')
file_data = file.readline() #读取一行,还没decode时,当遇到\n ,表示读取结束
print(file_data)
file_datas  = file.readlines() #读取每行数据,并把每行数据放进一个列表里
print(file_datas)
file.close()

拷贝文件

当文件size比较大,我们可以一点一点的读,读一点拷贝一点,这样就对内存要求没那么大。

拷贝文件

1.打开源文件读取数据 
rb模式是比较通用的模式,可以兼容不同类型的文件,包括图片
src_file = open("test.txt",'rb')
file_data = src_file.read()

2.打开目标文件准备写入数据
dst_file = open("test[副本].txt",'wb')
dst_file.write(file_data) #把源文件中的数据写入目标文件
dst_file.close()
src_file.close()

模拟大文件拷贝

file = open('test.txt','rb')
des_file = open('test[副本].txt','wb')
#循环读取文件中的数据
while True:
    fileData = file.read(1024) #读取的数据在0~1024之间
    #判断数据是否读取完成
    if fileData:  #判断二进制变量类型是否有数据,或写成if len(fileData)>0:
        des_file.write(fileData)
    else:
        print('数据读取完成:',fileData)#输出是空的,代表读完了并copy完成
        break
des_file.close()
file.close()

if判断的扩展

if : 可以做好多类型的判断,Boolean类型,数字类型,容器类型(字符串,列表,元组,字典,集合,二进制数据),None空值

布尔类型
if True:
    print('条件成立')

数字类型:非0即真
if 1:  		 #除了0都成立,负数也可以
    print('条件成立')
if 0:      #不成立,不会输出
    print('不成立')

容器类型判断的时候,如果容器类型里面有数据那么条件成立,否则条件不成立
if '':
    print('不会输出,不成立')
if 'xxx':
	print('条件成立')
	
None 类型,非空就成立:	
if not None:
    print('成立')

文件和文件夹的相关操作

file = open('4.txt','w',encoding='utf-8')
file.write('abc')
file.close()

1.觉得名字改的不好,想修改一下
import os
os.rename('4.txt','changeName.txt')

2.创建文件夹
os.mkdir('AAA')
os.rename('AAA','bbb') #修改文件夹名字

3.指定路径创建文件
第一种方法:指定路径创建
file = open('bbb/2.txt','w',encoding='utf-8')
file.close()
第二种方法:切换到bbb文件夹
path = os.getcwd()#查看当前目录
print(path)
os.chdir('bbb')
path = os.getcwd()#查看当前目录
print(path)
file = open('3.txt','w',encoding='utf-8')
file.close()

4.既要修改文件夹名字以同时修改文件名
os.renames('ccc/3.txt','ddd/4.txt')
注意:当文件夹只有一个文件的时候,
就是直接修改文件夹名称和里面文件的名字,
但是当文件夹有多个文件,它会创建新的文件夹ddd,
3.txt复制到ddd中改名为4.txt,
然后删除ccc里面的3.txt,其余文件保留在ccc中

5.查看目录下的文件名列表信息,输出是个列表
file_name_list = os.listdir('ddd') #os.listdir('.')指当前目录
print(file_name_list)

6.删除文件
os.remove('ddd/4.txt')
os.rmdir('ddd')
os.rmdir('bbb') #bbb里有文件,这里报错,只能删除空目录

7.删除目录树
import shutil #文件操作高级模块
shutil.rmtree('bbb')

8.获取文件名为test.txt的绝对路径
abs_path = os.path.abspath('test.txt')
print(abs_path)
输出:E:\pyTest\test.txt

9.根据绝对路径获取路径中的文件名
filename = os.path.basename(abs_path)
print(filename)
输出:test.txt

10.获取文件名和后缀
result = os.path.splitext(filename)
print(result) 
输出:('test', '.txt')  #以元组方式输出

name,extend = os.path.splitext(filename)  #元组拆包
print(name,extend)
输出: test .txt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值