Python文件存取实战:内置方法、NumPy、OS及CSV模块详解
本文系统梳理Python中四种主流文件存取方式。详细解析内置open/write/read/close方法及其with语法最佳实践;介绍NumPy模块中loadtxt/savetxt处理数组数据的用法;列举os模块中文件创建、重命名、删除及底层写入操作;最后演示csv模块读写CSV文件的完整流程。涵盖参数说明、代码示例及常见错误排查,适合Python初学者及需要处理数据文件的开发者参考。
前言:
近期在深入学习TensorFlow框架时,选修课程要求任选一种框架实现MNIST手写数字识别分类。我跟随主流选择了TensorFlow框架,边学边做,利用不同的神经网络结构完成了识别分类任务。其中关键一步是将训练生成的模型进行保存,以便在后续测试阶段加载调用。联想到这种“先保存、后加载”的模式,在Python文件存取中同样常见。本文将具体介绍几种实现方式。
(注:尽管技术文章篇幅较长可能影响阅读率和互动数据,但为了记录学习过程中的笔记,方便日后查阅或供他人参考,仍决定详细整理如下内容。)
方法预览
●Python内置方法
●numpy模块方法
●os模块方法
●csv模块方法
Python内置方法
无需依赖外部库,Python内置方法即可满足文件存取需求。本节主要介绍几种内置方法的使用方式,并在末尾通过实际案例进行展示:
1、open()方法
file object = open(file_name [, access_mode][, buffering])
该方法用于按指定模式打开文件,各参数含义如下:
file_name:包含要访问的文件名的字符串值。
access_mode:决定打开文件的模式,如只读、写入、追加等。所有可选取值见完整列表。此参数非强制,默认模式为只读(r)。常用文件访问模式见下图(来源:网络)

buffering:若设为0,则无缓冲;若设为1,访问文件时按行缓冲;若设为大于1的整数,表示缓冲区的缓冲大小;若设为负值,则使用系统默认缓冲大小。
2、close()方法
fileObject.close()
File对象的close()方法会刷新缓冲区中未写入的信息并关闭文件,此后无法再写入。当文件对象的引用被重新指定给另一个文件时,Python会自动关闭之前的文件。养成使用close()方法关闭文件的习惯是良好的编程实践。
3、write ()方法
fileObject.write(string)
write()方法可将任何字符串写入已打开的文件。需注意,Python字符串可包含二进制数据,而不仅是文本。write()方法不会在字符串末尾自动添加换行符('\n');传递的参数即为要写入已打开文件的内容。
4、read () 方法
fileObject.read([count])
read()方法从已打开的文件中读取字符串。需注意,Python字符串可包含二进制数据,而不仅是文本。传递的参数为从已打开文件中读取的字节计数。该方法从文件开头开始读入,若未传入count,则尝试尽可能多地读取内容,直至文件末尾。
5、举例分析
通常建议小伙伴使用with ...as...写法,该写法在执行完代码块后会自动执行close,既简化了程序,又避免了因疏忽或其他原因造成的错误。下面给出一个实际案例。
#先用open方法打开(不存在则创建)一个文件,
#write方法写入内容,这里with写法不用手动close
#注意这里是模式‘a',意味着写入内容不覆盖已有内容
with open('test.txt','a') as file_test:
file_test.write('小詹是个美男子!\n')
file_test.write('请关注公众号【小詹学python】!\n')
#注意利用read方法读取内容,模式要设置为可读模式
#read()方法不带参数,表示默认读取最长内容
with open('test.txt','r') as file_test:
str = file_test.read()
print(str)输出结果会在目录下生成一个test.txt文件,并读取后输出所有内容。下图为执行三次的结果,说明模式‘a'不会覆盖已有内容(重要的事情说三遍!)

numpy模块方法
本节主要介绍numpy模块中的两个常用方法,用于保存和读取数据。
np.loadtxt(filename, dtype=int, delimiter=' ') np.savetxt(filename, a, fmt="%d", delimiter=",")
其中,filename为要保存或读取的文件名,a为存取的内容,delimiter为分隔符号。使用方法简单,代码如下:
import numpy as np
a=np.arange(0,10,0.5).reshape(4,-1)
#改为保存为整数,以逗号分隔
np.savetxt("a.txt",a,fmt="%d",delimiter=",")
#load时也要指定为逗号分隔
b = np.loadtxt("a.txt",delimiter=",")
print('b=\n',b)其运行结果,创建了一个名为’a.txt‘ 的文件,保存了数组,并print打印出来读取结果,如下图:

os模块方法
python中的os模块功能强大,提供了许多文件处理操作的方法。以下列举出常用的几种方法。
1、os.open()
os.open(file, flags[, mode]);
其中,参数含义为:
file -- 要打开的文件
flags -- 该参数可以是以下选项,多个使用 "|" 隔开:
- os.O_RDONLY: 以只读的方式打开
- os.O_WRONLY: 以只写的方式打开
- os.O_RDWR : 以读写的方式打开
- os.O_NONBLOCK: 打开时不阻塞
- os.O_APPEND: 以追加的方式打开
- os.O_CREAT: 创建并打开一个新文件
- os.O_TRUNC: 打开一个文件并截断它的长度为零(必须有写权限)
- os.O_EXCL: 如果指定的文件存在,返回错误
- os.O_SHLOCK: 自动获取共享锁
- os.O_EXLOCK: 自动获取独立锁
- os.O_DIRECT: 消除或减少缓存效果
- os.O_FSYNC : 同步写入
- os.O_NOFOLLOW: 不追踪软链接
2、os.rename(current_name,new_name)方法用于更改文件名称
3、os.remove(filename)方法用于删除指定文件
4、os.mkdir('newdir')方法用于创建单层目录,如果该目录已存在会抛出异常
5、os.chdir('newdir')方法用于改变当前工作目录
6、os.getcwd()方法获取当前工作目录
7、os.write(fd,str)向指定文件写入内容,注意str要转换成byte
这里注意针对内容的写入举例,注意str要转换成byte,否则会报错(a bytes-like object is required, not ‘str’)!
import os
# # 打开文件
fd = os.open("f1.txt",os.O_RDWR|os.O_CREAT)
# # 写入字符串
line = "this is xiaozhan"
b = str.encode(line)
os.write(fd,b)
# #直接写str报错:a bytes-like object is required, not ‘str'
os.close(fd)
#以可读模式打开
fd = os.open("f1.txt",os.O_RDWR)
ret = os.read(fd,16)
print(ret)
os.close(fd)
print('finish close')
# os.remove('f1.txt')运行结果如下:

csv模块方法
和前几种方法一样,主要是读取和写入两个部分。主要依靠csv.reader(),csv.writer()和writerow()方法。和前边几种大同小异,这里直接代码中讲解基础的使用方式。
import csv
with open('l.csv', 'w',newline='') as csvfile:
#csv.writer()方法创建
eWriter = csv.writer(csvfile)
#用writerow()方法逐行写入
eWriter.writerow(['ID', '名字', '粉丝数量'])
eWriter.writerow(['xiaoxiaozhantongxue','小詹学python',15000])
eWriter.writerow(['xiaoxiaozhantongxue','小詹学python',15000])
eWriter.writerow(['xiaoxiaozhantongxue','小詹学python',15000])
#打开文件,用with打开可以不用去特意关闭file了,python3不支持file()打开文件,只能用open()
with open('l.csv','r') as csvfile:
#读取csv文件,返回的是迭代类型
read = csv.reader(csvfile)
for i in read:
print(i)运行结果如下图:

以上就是本次整理的内容了,方便自己查阅也希望对各位读者有一丢丢用噢!文章太长,耐心看到这的,我得给你点个赞,送你一个么么哒。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对本站的支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













