首页 > 编程语言 >[Python学习笔记]Python基础-14 文件操作

[Python学习笔记]Python基础-14 文件操作

时间:2022-08-17 14:55:21浏览次数:45  
标签:文件 14 Python 笔记 json file print open name

打开文件

  • 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
      • 使用 / 来进行分割 推荐
  • 文件路径分为两种
    • 绝对路径:从盘符开始的路径
    • 相对路径:从当前目录开始的路径
      • ./ 表示当前路径,可省略
      • ../ 表示上级路径

文件的打开方式

  • 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
From: https://www.cnblogs.com/Lz-heng/p/16595191.html

相关文章

  • 8.14
    CF1463F题意:规定一组正整数\(S\)。当且仅当满足以下条件时该组正整数成立:\(S\subseteq\{1,2,...,n\}\)如果\(a\ins\)并且\(b\ins\),那么\(|a-b|\not......
  • 基于C++的OpenGL 14 之模型加载
    1.引言本文基于C++语言,描述OpenGL的模型加载前置知识可参考:基于C++的OpenGL13之Mesh-当时明月在曾照彩云归-博客园(cnblogs.com)笔者这里不过多描述每个名词......
  • C++primer练习14.10-23
    练习14.10对于Sales_data的输入运算符来说给定下面的输入会发生什么?(a)0-201-99999-91024.95正常输入(b)1024.950-210-99999-9最后一个输入格式错误,会chongz练习14.11......
  • 入门笔记
    第一个程序LearnOpenGL视口glViewport函数前两个参数控制窗口左下角的位置。第三个和第四个参数控制渲染窗口的宽度和高度(像素)。也可以将视口的维度设置为比GLFW的维度......
  • Python爬虫之多线程异步爬虫,非常详细
    Python爬虫之多线程爬虫在使用Python的过程中,我们可能遇到这样一个场景,需要下载某一个网站上的多个资源;例如:我们想下载豆瓣电影Top250所有的宣传图片具体代码如下......
  • [LeetCode] 1314. Matrix Block Sum 矩阵区域和
    Givena mxn matrix mat andaninteger k,return amatrix answer whereeach answer[i][j] isthesumofallelements mat[r][c] for:i-k<=r<=......
  • Python逆向爬虫之pyquery,非常详细
    系列目录Python逆向爬虫之pyquerypyquery是一个类似jquery的python库,它实现能够在xml文档中进行jQuery查询,pyquery使用lxml解析器进行快速在xml和html文档上操作,它提供了......
  • 手写卷积单元-python
    一个文本卷积模块defcnn():importnumpyasnpresult=[]n,dim=10,30kernels=[np.random.randint(0,2,(i,dim))foriinrange(3,6)]#......
  • 毫米波雷达-学习笔记
    入门材料自动驾驶毫米波雷达物体检测技术毫米波雷达物体检测技术(硬件&软件)TI:mmWave系列培训3.3mmWave生命体征实验......
  • 【笔记】DDD实战课-人保架构欧创新
    开篇学好DDD,你能做什么?DDD是一种思想,可以指导中台设计和微服务的拆分。应用DDD的前提:1、要吃透DDD的核心设计思想,2、搞清楚DDD、微服务和中台之间的关系。三角关......