加载中...

Python——文件操作

文件操作

一. 计算机编码和解码

我们都知道,计算机只能识别0和1, 但是它是如何将我们输入的内容展示出来的呢?

image-20210831144341612

1.1 编码表

image-20210831145310938

1.2 编码

gbk

编码encode就是把人类语言转成计算机语言。

print('你好'.encode('gbk'))  #  b'\xc4\xe3\xba\xc3'

image-20210831150652636

image-20210831150755233

gbk汉字内码扩展规范编码表

http://ff.163.com/newflyff/gbk-list/

utf-8

print('你好'.encode('utf-8')) #  b'\xe4\xbd\xa0\xe5\xa5\xbd'

查看字符编码

http://www.mytju.com/classcode/tools/encode_utf8.asp

image-20210831151604568

1.3 解码

解码decode就是把计算机语言转成人类语言。

print(b'\xc4\xe3\xba\xc3'.decode('gbk')) #  你好 
print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf-8'))  # 你好

注意 :

decode()默认是utf-8

**之前是什么编码方式 ,解码的话也要按照什么方式来解码

如果出现乱码时 : 那么编码方式不是gbk 就是utf-8

二. 绝对路径和相对路径

2.1 绝对路径

'C:\Users\Administrator\Desktop\Python编程讲义\课件\06 函数综合应用 名片管理系统'

2.2 相对路径

'./测试.txt'
'测试.txt'

三. 文件的读写

什么是文件 ?

image-20210831155653284

总结:文件操作的作用就是把一些内容(数据)存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力。

文件的基础操作

  1. 打开文件
  2. 读写等操作
  3. 关闭文件

3.1 打开

在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下:

open(name, mode)

name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。

mode:设置打开文件的模式(访问模式):只读、写入、追加等。

模式描述
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式
w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。

image-20210930142416337

写入

# 打开文件
f = open('ceshi.txt','w',encoding= 'utf-8')
# 写入文件
f.write('这是测试的文件,相对路径')
# 关闭文件
f.close()

# 打开文件  注意转义 比如\n
f = open(r'C:\Users\Administrator\Desktop\Python编程讲义\课件\07 文件操作\ceshi.txt','w')
# 写入文件
f.write('这是测试的文件,绝对路径')
# 关闭文件
f.close()   


# 追加 
f = open('ceshi.txt','a',encoding= 'utf-8')
f.write('\n')
f.write('这是测试的文件,相对路径1111')
f.close()

注意 :

  1. open函数默认的编码格式是 比如Window上默认字符编码为GBK,Linux上默认字符编码为UTF-8。
  2. wa模式:如果文件不存在则创建该文件;如果文件存在,w模式先清空再写入,a模式直接末尾追加
  3. r模式:如果文件不存在则报错。

转义

为什么转义 ? 比如 \n 代表的是换行, 但是在绝对路径中有的是 D:\\nxxx\\txxx\\x1 此时 电脑以为你要换行 ,

但是你认为是一个nxxx的一个文件夹 ,导致出现歧义 ,必须统一所以 ,才有转义这个概念

在windows中编写路径时,一般有两种方式:

  • 加转义符,例如:"D:\\nxxx\\txxx\\x1"
  • 路径前加r,例如:r"D:\\nxxx\\txxx\\x1"

image-20210930140721253

3.2 读取

read()

f = open('ceshi.txt','r',encoding= 'utf-8') # r表示读取 

print(f.read())
f.close()

#这是测试的文件,相对路径这是测试的文件,相对路径1111
#这是测试的文件,相对路径1111

readlines()

f = open('ceshi.txt','r',encoding= 'utf-8')
print(f.readlines())
f.close()

# ['这是测试的文件,相对路径这是测试的文件,相对路径1111\n', '这是测试的文件,相对路径1111']

readline()

f = open('ceshi.txt',encoding='utf-8')
line = f.readline() # 打印第一行 
print(line)



f = open('ceshi.txt','r',encoding='utf-8')
content = f.readline()
print(f'第一行:{content}')
content = f.readline()
print(f'第二行:{content}')

# 关闭文件
f.close()

3.3 with

之前对文件进行操作时,每次都要打开和关闭文件,比较繁琐且容易忘记关闭文件。

以后再进行文件操作时,推荐大家使用with上下文管理,它可以自动实现关闭文件。

with open('ceshi.txt') as fp :
    line = fp.readline()
    print(line)
    line = fp.readline()
    print(line)
    
# 好处 简洁和不用手写close函数 因为已经自己默认关闭了 


#文件的写操作
with open('output_filename.csv', 'w') as f:
   f.write('hello world')  

3.4 案例

def find_answer(question):

    with open('replay.txt', 'r', encoding='utf-8') as file:
        while True:
            line = file.readline()
            if not line:
                break
            # 字符串的分割
            keyword = line.split('|')[0]  # 订单
            replay = line.split('|')[1]  # 订单的回复
            if keyword in question:
                return replay
    return False

    # file = open('replay.txt', 'r', encoding='utf-8')
    # while True:
    #     line = file.readline()
    #     if not line:
    #         break
    #     # 字符串的分割
    #     keyword = line.split('|')[0]  # 订单
    #     replay = line.split('|')[1]  # 订单的回复
    #     if keyword in question:
    #         return replay
    # file.close()
    # return False
    


if __name__ == '__main__':
    question = input('您好,有什么烦恼可以和我说下:')
    while True:
        if question == 'bye':
            break

        replay = find_answer(question)
        if not replay:
            question = input('没有您的问题 ,您可以问下关于订单,物流,账户,支付等问题(退出请输入bye)')
        else:
            print(replay)
            question = input('您可以再问下关于订单,物流,账户,支付等问题(退出请输入bye):')

    print('小主再见!')


# txt文本内容 
replay.txt
订单|您有问题可以登录淘宝,点击我的订单,查看详情
物流|您有问题可以点击物流详细信息,来进行查询物流
账户|关于账户的问题问人工客服,电话: 1999999999
支付|去找马云爸爸吧

image-20210930143049872

s = '五 花   八门、\n'

print(s.split())


with open('words.txt', 'r') as fr :
    print(fr.readlines())
    for text in fr.readlines():
        pass
        # print(text.strip("\n")) # 
        # print(list(text.strip("\n")))第一行\n是去掉了 ,第二行去掉\n变成空


with open('words.txt', 'r') as fr, open('new.txt', 'w') as fd:
    for text in fr.readlines():
        print(text.split())
        if text.split():
            fd.write(text)





"""
易错点 :
1: write在写入的时候 , 不换行,但是为啥在这就换行 ?
2: if [] : 
    pass  #  这行代码是不执行的,因为是空列表
3: readlines 是返回一个列表形式,注意区别
4: text.split() ,默认是去掉换行把空格进行分隔  分成列表的形式
5: 特别注意:写入的时候 text不是单纯地字符串,还有'\n' ,debug的时候可以看到
   所以才write写入时候,会发生换行 
    
思想 :
1: 因为原来的数据,有空行(这个需要去掉)
2: 需要读出来,再重新写入一个新的文件或者覆盖源文件
"""

四. 二进制文件操作

数据库文件、图像文件、可执行文件、音视频文件、Office文件等都是二进制文件,不能使用文本编辑进行正常读写,必须对其序列化才能读写

4.1 使用pickle模块

import pickle
f=open('samle_pickle.dat','wb')
n=7
i=13.000000
a=99.056
s='中国公民 123abc'
lst=[[1,2,3],[4,5,6],[7,8,9]]
tu=(-5,10,8)
coll={4,5,6}
dic={'a':'apple','b':'banana','g':'grade','o':orange}
try:
	pickle.dump(n,f)
	pichle.dump(i,f)
	pickle.dump(a,f)
	pickle.dump(s,f)
	pickle.dump(lst,f)
	pickle.dump(tu,f)
	pickle.dump(coll,f)
	pickle.dump(dic,f)
except:
    print('写文件异常')
finally:
    f.close

4.2 使用struct模块

import struct

n=13000000000
x=96.33
b=True
s='fuugwgu中国'
sn=struct.pack('if?',n.x.b)
f.open('sample_struct.dat','wb')
f,write(sn)
f.write(s)
f.close()

五. 文件级与目录操作

如果需要处理文件路径,可以使用os.path模块中的对象和方法;如果需要使用命令行读取文件内容可以使用fileinput模块;创建临时文件和文件夹可以使用tempfile模块

5.1 os与os.path模块

这里随便举一个例子,os模块是一个很强大的模块,后续还会进行讲解

#将当前目录的所有.html文件重命名为.htm

import os
file_list=os.listdir('.')
for filename in file_list:
	pos=filename.rindex('.')
	if filename[pos+1]:=='html'
	newname=filename[:pos+1]+"htm"
	os.rename(filename,newname)
	print(filename+"更名为"+newname)

目录操作

import os
os.getcwd()		#返回当前工作目录

os.mkdir(os.getcwd()+'\\temp')		#创建目录

#遍历目录
import os
def visitDir():
	for filename in names:
		print(os.path.jion(dirname,filepath))
os.path.walk('C:\\music',visitDir())

5.2 shuil模块

复制文件
import shuil
shuil.copyfile('C:\\dir.txt','C:\\dir1.txt')

#压缩文件,将C:\\python\shu文件夹以及该文件夹中所有文件压缩值D:\\a.zip

shuil.make_archive('D:\\a','zip','C:\\python','shu')
posted @ 2021-10-24 09:43  冰山一树Sankey  阅读(20)  评论(0编辑  收藏  举报