ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-08-17 15:05:21  阅读:180  来源: 互联网

标签:文件 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
来源: https://www.cnblogs.com/Lz-heng/p/16595191.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有