Python 极简核心:文件

有几条逻辑先写在前面:

  • 必须首先使用open函数,打开文件之后才有后续的write和read操作
  • 需要在open函数中就定义好文件的使用用途(设置open函数的参数),比如读、写、还是读写、还是追加等等
  • 指针的位置直接影响目标内容

本文章,主要从基本的打开、写、读和文件操作两个大的方向来进行小结。

1. 文件打开、写入、读取的简要概述

open函数

open()函数是Python内置的函数,用来创建一个file对象,记住:有了file对象,相关的方法才可以调用它进行读写
其基本用法为:fileObject = open(xx, x)
这里,xx代表要打开的文件,x指的是参数。
(以下都省略了打开的文件)

open(, r):只读,不创建
open(, r+):读 + 写,不创建
open(, w):只写
open(, w+):写 + 读
open(, a):追加方式写(不覆盖)
open(, a+):追加方式写 (不覆盖)+ 读
即,加号'+'代表额外方式

附:open(, rb):只读,以二进制格式打开(非人工书写数据,如图片等)
在这里插入图片描述
注:

  • w+与r+区别
    r+:可读可写,若文件不存在,报错;w+: 可读可写,若文件不存在,创建

write函数

write() 方法用于向文件中写入指定字符串,用法:fileObject.write(str)

read函数

fileObject.read():text ——> one whole str
fileObject.readline():one line ——> one str
fileObject.readlines():all line ——> one list with all lines

指针与seek函数

指针会随你的读写操作而向后移动

  • open文件之后,指针就在文件内容的起始位置
  • write函数之后,指针就在写入的内容之后
  • read函数之后,指针在读取的内容之后,
    例如使用read(),则指针会从起始位置移动,直到文件的末尾

所以,如果发现获取的并非自己想取的内容,很可能就是因为指针的位置不对
这种情况,就应该使用 seek() 来指定指针的位置。

注:seek(0) 指向开头

2. 简单例子

这里的例子详细的介绍了 write、read、readline和readlines的用法。

open函数的w模式w+模式

  • 首次写入
# 首次写入
with open('write_files.txt', 'w') as f1:
    f1.write('1 2 3\n4 5 6') # 只要没有退出文件,就可以连续写入
    f1.write('7 8 9')

with open('write_files_w+.txt', 'w+') as f2:
    f2.write('a b c\nd e f')  # 只要没有退出文件,就可以连续写入
    f2.write('g h i')

结果:
(文件中写入的内容)
在这里插入图片描述

  • 再次写入
# 再次写入
with open('write_files.txt', 'w') as f1:
    f1.write('w模式,重新写入...')  # 再次写入会完全清空之前的文件

    # w模式下使用read函数会导致报错(io.UnsupportedOperation: not readable),因为 w 模式不可 读取
    #lines = f1.read()
    #print(lines)

with open('write_files_w+.txt', 'w+') as f2:
    f2.write('w+模式,重新写入...')   # 再次写入会完全清空之前的文件
    f2.seek(0) # 将经过write之后的指针移到文件开头
    red = f2.read()
    f2.seek(0)  # 将经过read之后的指针移到文件开头
    readline = f2.readline()
    f2.seek(0) # 将readline()之后的指针移动到文件开头
    readlines = f2.readlines()
    print(f'read: {red}') # read()读取所有的内容,并且将其作为一个完整的字符串
    print(f'readline: {readline}')  # readline()只读取一行内容,且是字符串格式
    print(f'readlines: {readlines}') # readlines()读取所有行,并将内容放在一个list里(注:由于这里总共只有一行,所以没有用到 for in 来遍历这个列表)

控制台打印结果:

read: w+模式,重新写入...
readline: w+模式,重新写入...
readlines: ['w+模式,重新写入...']

文件中写入的内容:
在这里插入图片描述

open函数的a模式和a+模式

在这里插入代码片
  • a 模式
# 1. a 模式
with open('write_file_a.txt', 'a') as f1:
    f1.write('x y z\n1 2 3')
    # w模式下使用read函数会导致报错(io.UnsupportedOperation: not readable),因为 w 模式不可 读取
    # lines = f1.read()
    # print(lines)

结果:
在这里插入图片描述

  • a+模式
# 2. a+模式
# 首次
with open('write_file_a+.txt', 'a+') as f2:
    f2.write('A B C')
    lines = f2.read()  # 这里是没有东西打印出来的,因为指针现在在最后面
    print(lines)
# 再次
with open('write_file_a+.txt', 'a+') as f2:
    f2.write('1 2 3')
    f2.seek(0) # 将指针移到头部
    lines = f2.read()  
    print(lines)

打印结果:

A B C1 2 3

3. json模块

写入

import json

data_dic = {'name':'robin', 'age':18, 'city':"Shanghai"}

# text = json.dumps(data_dic) # json.dumps:字典 -> 文件字符串
# print(text)
f = open('demo.json', 'w')  # 新建 json 文件
json.dump(data_dic, f)      # json.dump :字典 -> JSON 文件

在这里插入图片描述

读取

  • json.load:将已编码的json文件解码为python对象
f = open('demo.json', 'r', encoding='utf-8')
f_dic = json.load(f)
print(f_dic)

返回:{'name': 'robin', 'age': 18, 'city': 'Shanghai'}

4. 文件操作

4.1 返回文件文件夹名称os.listdir()

具体来说,是返回目标路径下所有类型格式文件文件夹名称(不是完整路径)的一个list类型

例子:

import os, glob

cwd = os.getcwd()
print(f"cwd:{cwd}")

lstdir = os.listdir(cwd)
print(f"lstdir:\n{lstdir}")

结果:

lstdir:
['Alan.png', 'json_demo.py', '.DS_Store', 'demo.json', 'example.log', 'test.py', 'image_to_json.py', 'restful.py', 'data', 'alan.json', '.idea']

可以看出来,结果不仅有各种文件,还有文件夹,但都是名称而不是完整地址。

一定要要注意,Mac 中存在隐藏文件'.DS_Store',因此使用os.listdir()要注意对结果进行一个过滤!

4.2 返回路径下的搜索结果:glob.glob()

具体来说,是输入指定匹配规则(Unix 终端所用规则)的搜索路径,返回目标结果的list类型类似于Windows下的文件搜索)

例子:

import os, glob

cwd = os.getcwd()
print(f"cwd:{cwd}")

globdir = glob.glob(os.path.join(cwd, "*.py"))  # 获取指定后缀文件的完整地址
print(f"globdir:\n{globdir}")
print()
for i in globdir :
    file_name = os.path.split(i)[1]  # 获取地址字符串最后面的文件名
    print(f"file_name:{file_name}")

结果:

globdir:
['/Users/robin/MLcode/Pycharm_Project/tensorflow/0708_PythonRESTful/json_demo.py', '/Users/robin/MLcode/Pycharm_Project/tensorflow/0708_PythonRESTful/test.py', '/Users/robin/MLcode/Pycharm_Project/tensorflow/0708_PythonRESTful/image_to_json.py',    ]

file_name:json_demo.py
file_name:test.py
file_name:image_to_json.py

小结:

  • 使用os.path.join()合并路径和文件名为一个完整路径
  • 使用os.path.split() 从完整路径中分割出文件名
  • os.path.splitext():去除文件后缀

4.3 os.walk()

可以看Python 文件之 os.walk()

参考:

  1. open函数的一些注意点及r,r+,w,w+,a,a+的区别
  2. Python 文件I/O
  3. python文件打开方式详解——a、a+、r+、w+区别
  4. Python:获取地址字符串中的最后的文件/文件夹名(字符串)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值