[Python学习笔记]Python基础-14 文件操作
作者:互联网
打开文件
- python中,使用 open 内置函数打开并操作一个文件
- open 参数介绍
file = open('xxx.txt',r,encoding='utf-8')
- file: 用来指定的打开的文件(文件路径)
- mode: 打开文件时的模式,默认是 r 表示只读
- encoding: 打开文件时的编码方式
- open 函数会有一个返回值,是打开文件的对象
<class '_io.TextIOWrapper'>
- 一般文件写入的时候会默认使用 utf-8 编码格式
- 在Windows操作系统中,默认会使用gbk编码格式打开文件,需要指定打开的编码模式
- 解决方案: 写入和读取使用相同的编码格式即可
- 操作文件完成之后,需要关闭文件
file.close()
文件路径
- 文件路径分隔符:
- 注意 在Python中,Windows系统里文件夹之间的
\
分隔符,会被表示为转义字符- 可以使用
\\
双斜线 - 或者在字符串之前加
r
- 使用
/
来进行分割 推荐
- 可以使用
- 注意 在Python中,Windows系统里文件夹之间的
- 文件路径分为两种
- 绝对路径:从盘符开始的路径
- 相对路径:从当前目录开始的路径
./
表示当前路径,可省略../
表示上级路径
文件的打开方式
- open 参数介绍
file = open('xxx.txt',r,encoding='utf-8')
- file: 用来指定的打开的文件(文件路径)
- mode: 打开文件时的模式,默认是 r 表示只读
- r : 只读模式,默认,打开文件以后只能读取,不能写入,如果文件不存在会报错
- w : 写入模式,打开文件以后,只能写入,不能读取.如果文件存在,会覆盖文件,如果文件不存在,会创建文件
- b : 以二进制的形式打开文件,可以用来操作非文本文件
- rb : 以二进制的形式读取文件
- wb : 以二进制的形式写入文件(只能写入二进制)
file.write('需要写入的字符串'.encode('uft8')
- a : 追加模式,会在最后追加内容,如果文件不存在,会创建文件;如果文件存在,会追加
- r+ : 可读写,文件不存在会报错(尽量不用)
- w+ : 可读写,文件不存在会创建文件(尽量不用)
- encoding: 打开文件时的编码方式
- open 函数会有一个返回值,是打开文件的对象
<class '_io.TextIOWrapper'>
文件的读取方式
read(x)
方法,将所有的数据都读取出来,其中x指的是读取的长度(一般都会给长度,避免文件过长)readline()
方法,只读取一行数据(可以配合while语句,一行一行将所有数据读取出来)readlines()
方法,读取所有行的数据,保存到一个列表里
# 按行循环读取某个文件
file = open('xxx.xx','rb',encoding='utf8')
while True:
contect = file.read(1024)
if not contect:
break
print(contect)
file.close()
实现文件拷贝功能
import os
# 实现文件复制功能
# 获取文件名
file_name = input('请输入一个文件名:')
# 判断文件是否存在
if os.path.isfile(file_name):
# 读取旧文件
old_file = open(file_name,'rb')
# 读取旧文件的数据到新文件中
# 生成新文件名称
name_cut = os.path.splitext(file_name)
new_file_name = name_cut[0] + '.bak' + name_cut[1]
print(new_file_name)
new_file = open(new_file_name,'wb')
# 将旧文件的数据写入到新文件
new_file.write(old_file.read())
# 关闭打开的文件
new_file.close()
old_file.close()
else:
print('该文件不存在')
csv文件的读写
csv文件的写入方法
import csv
file = open('damo.csv','w',encoding='utf8',newline='')
# 写文件采用csv.write方法
# writerows
# writerow
w = csv.writer(file)
w.writerow(['name','age','soure','city'])
w.writerow(['zhangsan','19','90','杭州'])
w.writerows(
[
['name','age','soure','city'],
['zhangsan','19','90','杭州']
]
)
file.close()
csv文件的读取方法
import csv
file = open('damo.csv','r',encoding='utf8',newline='')
# 读取方法,csv.reader
r = csv.reader(file)
print(r)
for data in r:
print(data)
file.close()
将数据写入到内存中
StringIO的使用
# 将数据写入到内存中 涉及到 StringIO和BytesIO两个类
from io import StringIO
s_io = StringIO()
s_io.write("hello")
s_io.write('good')
print(s_io.getvalue())
将数据临时保存在内存中,如果程序结束,则内存中的值就不存在了
# 使用print函数的file方法,指定将打印的内容保存到内存中
from io import StringIO
s_io = StringIO()
print('hello',file=s_io)
print('ok',file=s_io)
print('good',file=s_io)
print(s_io.getvalue())
# hello
# ok
# good
BytrsIO的使用
from io import BytesIO
b_io = BytesIO()
b_io.write('你好'.encode("utf8"))
print(b_io.getvalue().decode('utf8'))
b_io.close()
标准输入/标准输出/错误输出
- sys.stdin 接收用户的输入,读取键盘输入的数据
- sys.stdout 标准输出
- sys.stderr 错误输出
import sys
# input实际上就是读取了stdin
s_in = sys.stdin
while True:
content = s_in.readline().rstrip('\n')
if content == '':
break
print(content)
# stdin和stdout默认都是标准控制台
# stdout可以指定标准输出位置
# stderr可以指定错误输出位置
sys.stdout = open('stdout.txt','w',encoding='utf8')
print('hello')
sys.stderr = open('stderr.txt','w',encoding='utf8')
print(1/0)
序列化和反序列化
- 序列化和反序列化也叫持久化和反持久化
- 序列化:将数据从内存持久化保存的过程
- 反序列化:将数据从持久化保存加载到内存的过程
json字符串的使用
- open函数仅支持写入字符串或者二进制
- 字典/列表/数字类型的数据都不能直接写入到文件中
- 将数据转换成字符串格式
- repr方法
- str方法
- json方法(最常用)
- json 本质就是字符串,区别在于json中,需要使用双引号表示字符串
names = ['zhangsan','lisi','wangwu','jack']
#转换为json后,该列表应该为 '["zhangsan","lisi","wangwu","jack"]'
- json中将数据持久化有两个方法:
- 方法1: dumps:将数据转换成json字符串,不会将数据保存到文件里
- 方法2: dump:将数据转换为json字符串的同时写入到指定的文件
方法1:
import json
file = open('names.txt','w',encoding='utf8')
names = ['zhangsan','lisi','wangwu','jack']
x = json.dumps(names) # dumps的作用,是将数据转换为字符串
print(x)
file.write(x)
file.close()
方法2:
import json
file = open('names.txt','w',encoding='utf8')
names = ['zhangsan','lisi','wangwu','jack']
json.dump(names,file)
file.close()
- json 反序列化也有两个方法
- 方法1: loads:将json字符串加载成为Python中的数据
- 方法2: load:读取文件,把读取的内容加载成Python中的数据
方法1
import json
x = '{"name":"zhangsan","age":"18"}'
p = json.loads(x)
print(p) # 转换成一个字典 {'name': 'zhangsan', 'age': '18'}
方法2
import json
# load 读取一个文件,并把文件中的json字符串加载成为一个对象
file1 = open('names.txt','r',encoding='utf8')
y = json.load(file1)
print(y) # ['zhangsan', 'lisi', 'wangwu', 'jack']
print(y[1]) # lisi
file1.close()
pickle模块的使用
- 将数据转换成为二进制:使用pickle模块
- 序列化方法
- dumps:将python数据转换为二进制
- dump:将python数据转换成二进制,同时保存到指定文件
- 反序列化方法
- loads:将二进制加载成为二进制数据
- load:读取文件,将文件的二进制内容加载成为python数据
import pickle
names = ['zhangsan','lisi','jack','herry']
# 方法1:dumps
b_name = pickle.dumps(names)
file = open('names.txt','wb')
file.write(b_name) # 以二进制的方式写入,文件无法读取
file.close()
# 方法1:loads
file1 = open('names.txt','rb')
x = file1.read()
y = pickle.loads(x)
print(y)
file1.close()
# 方法2:dump
file2 = open('names.txt','wb')
pickle.dump(names,file2)
file2.close()
# 方法2:load
file3 = open('names.txt','rb')
y = pickle.load(file3)
print(y)
file3.close()
- 使用二进制方法进行保存后,在读取出之后具有保存之前的属性
- 实例:将一个类以二进制的形式保存到文件中
import pickle
class Dog(object):
def __init__(self,name,age) -> None:
self.name = name
self.age = age
def eat(self):
print(self.name + '正在吃东西')
d = Dog('大黄','4')
# 将d保存到文件中
pickle.dump(d,open('dog.txt','wb'))
# 从文件中读取保存的类
testdog = pickle.load(open('dog.txt','rb'))
testdog.eat()
print(testdog.name,testdog.age)
json和pickle的区别
- 使用 json 的情况
- 只能保存一部分信息
- 作用是用来在不通的平台中传递数据
- json中存储的一般都是比较基础的数据类型(数字/字典/列表)
- 使用 pickle 的情况
- 用来将数据原封不动的转换从二进制
- 但是这个二进制只能在python中识别
异常处理
- 由于在程序运行过程中,程序编码不规范等.造成程序无法正常执行,此时程序就会报错
- 异常是为了保证程序的健壮性
- 很多编程语言都有异常处理机制
try except语句
如果程序出错,会立刻跳转到except语句,出错语句之后的语句不会执行
如果程序不出错,则会执行else语句中的代码
def chu(a,b):
return a/b
try:
x = chu(5,0)
except Exception as e:
print('程序出错了')
else:
print('程序的结果是 ',x)
except语句
- try...except 语句用来处理程序运行过程中的异常
- except语句中的参数可以用于处理指定类型的异常
- Exception 所有类型的错误
- FileNotFoundError 找不到文件
- ZeroDivisionError 0作为除数错误
- ....
try:
pass # 尝试运行XXX代码,如果出错,立刻跳转到except语句
except Exception as e: # 此处except后可以跟需要处理的错误类型
pass # 出错之后运行的代码
else:
pass # 如果没有出错,执行的代码
标签:文件,14,Python,笔记,json,file,print,open,name 来源: https://www.cnblogs.com/Lz-heng/p/16595191.html