意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

Python基础 - 文件处理(上)

来源:佚名 编辑:佚名
2024-02-03 04:34:59

理解 "一切皆文件"的思想, 和文件的 read() 和 write(), 自动化办公的必备.

读写文件, 文件备份, 上传资料这些操作应该是大家日常工作中每天都要做的事情. 而文件呢, 又有不同的类型(后缀名), 比如 .txt, .xls, .xlsx, .csv, .json, .sql .... 等等各种文件. 在我日常的数据工作中, 读取文件数据, 处理, 写入文件这样的操作几乎是每天都要做的事情. 我们的从编程入门的角度来讲, 文件处理算是一个最能快速应用到工作的了. 尤其是 不同编程的小伙伴, 如果要是学会了文件处理, 那绝对能大幅度提高工作效率的.

突然想吐槽一下 文件处理


Python基础 - 文件处理(上)

之间接触很多的文员小伙伴, 日常办公, 很大时间都在处理一些表格, 文档之类的, 重复性很高, 然而他们总是去手工一个个处理, 经常加班还觉得自己很充实...其实在我看来, 就是工作效率低下的自我安慰, 一定程度上. 我真的很想分享给他们, 只要稍微学一点点编程, 或有那么一点点编程的思维, 然后求助一下, 比如我, 重复性的工作让机器来做不更好吗, 无非就是一些文件批处理, 什么合并, 提取特定数据 之类的....

突然想起, 以前营销专业课上, 有老师分享说, 最难的事情, 莫过于, "把我的思想, 传输给你的大脑 和 把我的手伸进你的钱包"

回到正题, 首先还是谈下对于 "文件" 的认识.

什么是文件

这对我算是一个灵魂发问.

我认为, 文件就是用来持久化存储数据的载体.

因为数据有不同的种类, 虽然底层都是二进制. 包含了字符, 图片, 声音, 视频这些.... 种类特别多, 因而为了做区分嘛, 才用不同的 文件类型来区分呀.

其实对于文件的认知, 莫过于 Linux 的观点: 一些皆文件.

接触或 Linux 的小伙伴就非常明白, Linux 下, 一切皆是文件. 一个程序, 也是一个文件, 各种配置文件等等. 也可以自定义文件的类型啥的. 都是 open 的, 就是用来存储数据的载体而已. 当然这也是抽象出来的概念, 就不往下深究了. 举个栗子, 一个 win 下的 exe 程序. 它不就是一个以 .exe 作为后缀的文件吗. 里面存储的是程序的代码.还有我们的数据库, 它本质也是将数据 按特定的规则存储的文件 而已. 可见文件在我们生活中扮演了极为重要的角色.

在 Python 中, 主要用 open() 函数来创建文件对象, 用的两个库主要是 os 和 pathlib, 这里主要先讲os, 主要是我个人用得熟练一些. 当然也参考 pathlib, 看了官方文档也还蛮强大的.

文件的open 与 close

我通常会先看看, 我当前的工作路径.

import os

# 查看当前路径
os.getcwd()
Out[4]: 'E:\\Jupyter notes\\Python_data_struct'

# 查看当前路径下有哪些文件
os.listdir()
Out[3]: ['.git', '.gitignore', '.idea', 'pythonds', 'test.py']

然后读取文件, 通常的写法是这样的, 用 with 这个上下文管理器.

with open("./test.py", 'r') as f:
f.read()
# 然后各种处理
'r' : 只读, 指针在头部, 这是默认模式.'w' : 只写, 指针在头部, 若文件已存在, 则会覆盖, 不存在则新建.'a' : 追加, 存在内容则指针在头; 不存在则新创建'rb' : 只读, 以二进制格式打开文件'wb' : 只写, 以二进制格式写入, 存在则覆盖, 不存在则新建'r+' : 打开一个文件, 可读可写, 指针在头'w+' : 打开一个文件, 可读可写, 存在则覆盖, 不存在则新增'a+' :追加, 可读可写, 指针在尾, 不存在则会新建

...

常用的无非就是这些, 读, 写, 和追加嘛.

文件的 read 和 write

数据读取有 3 中方式, 读取固定长度, 读取一行, 全读.

Python 的文件对象, 其实是一个 "迭代器", 创建的时候并未全部加载内存, 用一点, 取一点

f.read() 默认是"全读", f.read(n) 表示读取长度为 n 的数据f.readline() 读一行. 若要全读则 while True ... 直到 len(某行)==0 break.中间可对每行自定义处理f.readlines() 全读. 返回一个列表, 每一行是列表的一个元素. 我用的挺少的.

写入数据: f.write(string...)

# 全读
with open("test.py", 'r+') as f:
print(f.read())
123
456
'abc', 'def'
'hello'
# 读取固定长度
with open("test.py", 'r+') as f:
print(f.read(5))
123
4
# 读取一行
with open("test.py", 'r+') as f:
print(f.readline())
print(f.readline())
123

456
# 以列表方式返回
with open("test.py", 'r+') as f:

print(f.readlines())

# 再往后写一条, 如果不加换行符 '\n' 则直接 append 到后面的哦
f.write("youge")
['123\n', '456\n', "'abc', 'def'\n", "'hello'youge"]

更常见的情景是按行读, 对每行进行一个操作.

with open("test.py") as f:
while True:
line = f.readline().strip()
print(line)

if len(line) == 0:
print("---end----")
break
123
456
'abc', 'def'
'hello'youge

---end----
case 文件备份

原理即从 A 文件 read() 然后 write() 到 B 文件而已.

def backup_file(file_name):
"""文件备份"""
try:
# 1. 读取文件
cur_file = open(file_name, 'rb')
except Exception:
print("未找到该文件 或 读取错误")
return

# 2. 找到文件后缀, 先找分割点位置 如 abc.txt 则'.' 的 index = 3
point_index = file_name.rfind('.')
suffix = file_name[point_index +1:]

# 3. 构建新的文件名
new_file_name = file_name[:point_index] + "副本" + suffix

# 4. 将数据写进新的文件即可
new_file = open(new_file_name, 'wb')
for line in cur_file.readlines():
new_file.write(line)

print()
print('---正在备份---')
print("备份成功!")

# 关闭文件
cur_file.close()
new_file.close()


if __name__ == '__main__':
# test
filename = input("请输入您要备份的文件名(包含后缀哦): \n")
backup_file(filename)
请输入您要备份的文件名(包含后缀哦): 
test.py

---正在备份---
备份成功!

看看手动异常处理:

请输入您要备份的文件名(包含后缀哦): 
fdsdsfsdfsdf
未找到该文件 或 读取错误

Process finished with exit code 0
文件定位

即定位光标的位置在哪, 工作用这个倒是用得挺少的.

获取当前光标位置: 用 tell() 函数即可

f = open('test.py')

# 当前位置
print("position:", f.tell())

print('get data:', f.read(2))
print("position:", f.tell())

print('get data:', f.read(3))
print("position:", f.tell())

f.close()
position: 0
get data: 12
position: 2
get data: 3
4
position: 6

定位到某个位置: 用 seek() 函数即可.

seek(offset, whence). offset 表示偏移量. whence 默认为0, 表示文件开头. 1表示当前位置, 2表示文件末尾.

f = open('test.py')

print('get data:', f.read(2))
print("position:", f.tell())

# 定位到
f.seek(3, 0)

print('position:', f.tell())

f.close()
get data: 12
position: 2
position: 3
小结通俗理解文件就是持久化存储数据的载体, Linux 万物皆文件, 程序, 字符, 数字, 图片, 声音都是文件文件的 open, 方式常用的就 'r', 'r+', 'w', 'a+' 即读, 写, 追加, 这样子而已.读取文件数据有 3种方式 f.read(); f.readline(); f.readlines() . 后两种非常常用哦文件的光标定位, 当前位置 tell(), 定位到某位置 seek(offset, whence), 我工作中几乎从未用到过

上篇就初步认识读写文件就行, 下篇主要是对两个模块 os, 和 pathlib 进行认识, 配合起来, 文件的绝大多数操作就没啥问题了, 然后如果再会用处理点数据, 对于 文员来说, 办公效率提升至少 10倍, 在某些固定任务上, 作为过来人的一点认知分享, 真的是这样子.

耐心和恒心, 总会获得回报的.



本网站发布或转载的文章均来自网络,其原创性以及文中表达的观点和判断不代表本网站。
上一篇: LSTM 与 GRU 下一篇: 手机怎么远程登录云服务器?