在Python中,文件读写是通过open()函数打开的文件对象完成的
open()函数常用的语法格式
open(file, mode='r', encoding=None, errors=None)
参数说明
file: 必需,文件路径(相对或者绝对路径)
mode: 可选,文件打开模式
encoding: 设置字符编码,一般使用utf-8
errors: 报错处理,表示如果遇到编码错误后如何处理
mode(文件打开模式)常用参数
模式 | 描述 |
r | 只读模式(默认模式),文件必须存在,不存在抛出异常 |
w | 只写模式(不可读),不存在则创建,存在则清空内容再写入 |
a | 只追加写模式(不可读),不存在则创建,存在则只追加内容 |
rb | 以二进制读取 |
wb | 以二进制写入 |
ab | 以二进制追加 |
数据源
要以读文件的模式打开一个文件对象,需要使用Python内置的open函数,传入文件名(file)和模式(mode)
file = open(r'C:\Users\X2001565\Desktop\demo.txt','r')
模式'r'表示读,这样我们就成功地打开了一个文件
如果文件不存在,open()函数就会抛出一个IOError错误,并且给出错误码和详细的信息告诉你文件不存在
# 报错,demo1.txt文件并不存在
#FileNotFoundError: [Errno 2] No such file or directory:'C:\\Users\\X2001565\\Desktop\\demo1.txt'
file = open(r'C:\Users\X2001565\Desktop\demo1.txt','r')
如果文件打开成功,接下来调用read()方法可以一次读取文件的全部内容,结果以字符串的形式返回
file = open(r'C:\Users\X2001565\Desktop\demo.txt','r')
# 'Hello World!!\nMy name is Andy\nWelcome to my blog'
file.read()
read(n)方法按照字符读取(r模式),按照字节读取(rb模式)
file = open(r'C:\Users\X2001565\Desktop\demo.txt','r')
# 因为mode='r',所以read(n)按字符读取
# 读取7个字符
# 'Hello W'
file.read(7)
调用readline()可以每次读取一行内容,结果以字符串的形式返回
file = open(r'C:\Users\X2001565\Desktop\demo.txt','r')
file.readline() # 'Hello World!!\n'
file.readline() # 'My name is Andy\n'
file.readline() # 'Welcome to my blog'
file.readline() # ''
调用readlines()一次读取所有内容并按行返回,返回一个列表,列表中的每个元素是原文件的每一行
file = open(r'C:\Users\X2001565\Desktop\demo.txt','r')
# ['Hello World!!\n', 'My name is Andy\n', 'Welcome to my blog']
file.readlines()
提示Tips: 如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便
file = open(r'C:\Users\X2001565\Desktop\demo.txt','r')
for line in file.readlines():
print(line.strip()) # 把末尾的'\n'删掉
file.close()
上述的输出结果如下所示:
Hello World!!
My name is Andy
Welcome to my blog
最后一步是调用close()方法关闭文件
file.close()
由于文件读写时都有可能产生IOError错误,一旦出错,后面的f.close()就不会调用。所以为了保证无论是否出错都能正确地关闭文件,Python引入with语句来自动帮我们调用close()方法
with open(r'C:\Users\X2001565\Desktop\demo.txt','r') as f:
print(f.read())
写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件
file = open(r'C:\Users\X2001565\Desktop\test.txt', 'w')
file.write('Hello, world!')
file.write('My name is Andy')
file.close()
可以反复调用write()来写入文件,但是务必要调用f.close()来关闭文件
我们也可以使用with语句自动帮我们调用close()方法
with open(r'C:\Users\X2001565\Desktop\test.txt', 'w') as f:
f.write('Hello, world!')
f.write('My name is Andy')
没有文件,则创建文件写入内容,如果文件存在,先清空原文件内容,再写入新内容
test.txt文件导入的内容如下所示
扩展补充知识
1.实现文件拷贝功能
数据集
import os
file_name = input('请输入一个文件路径:')
if os.path.isfile(file_name):
old_file = open(file_name, 'rb') # 以二进制的形式读取文件
names = os.path.splitext(file_name)
new_file_name = names[0] + '.bak' + names[1]
new_file = open(new_file_name, 'wb') # 以二进制的形式写入文件
while True:
content = old_file.read(1024) # 读取出来的内容是二进制
new_file.write(content)
if not content:
break
new_file.close()
old_file.close()
else:
print('您输入的文件不存在')
输入需要拷贝的文件路径
结果如下所示
2.CSV文件读写
CSV文件(Comma-Separated Values),中文叫逗号分隔值或者字符分割值,其文件以纯文本的形式存储表格数据。可以把它理解为一个表格,只不过这个表格是以纯文本的形式显示的,单元格与单元格之间,默认使用逗号进行分隔;每行数据之间,使用换行进行分隔。
数据集
Python中的csv模块提供了相应的函数,可以让我们很方便的读写csv文件
CSV文件的读取
import csv
# 以读取方式打开一个csv文件
file = open(r'C:\Users\HP\Desktop\sales.csv', 'r')
# 调用csv模块的reader方法,得到的结果是一个可迭代对象
reader = csv.reader(file)
# 对结果进行遍历,获取到结果里的每一行数据
'''
['NA_Sales', 'EU_Sales', 'JP_Sales', 'Other_Sales', 'Global_Sales']
['41.49', '29.02', '3.77', '8.46', '82.74']
['29.08', '3.58', '6.81', '0.77', '40.24']
['15.85', '12.88', '3.79', '3.31', '35.82']
['15.75', '11.01', '3.28', '2.96', '33']
['11.27', '8.89', '10.22', '1', '31.37']
['23.2', '2.26', '4.22', '0.58', '30.26']
['11.38', '9.23', '6.5', '2.9', '30.01']
['14.03', '9.2', '2.93', '2.85', '29.02']
['14.59', '7.06', '4.7', '2.26', '28.62']
'''
for row in reader:
print(row)
file.close()
CSV文件的写入
import csv
# 以写入方式打开一个csv文件
file = open(r'C:\Users\HP\Desktop\sales.csv','w')
# 调用writer方法,传入csv文件对象,得到的结果是一个CSVWriter对象
writer = csv.writer(file)
# 调用CSVWriter对象的writerow方法,一行行的写入数据
writer.writerow(['NA_Sales', 'EU_Sales', 'JP_Sales', 'Other_Sales', 'Global_Sales'])
# 还可以调用writerows方法,一次性写入多行数据
writer.writerows([['1', '1', '1', '1', '1'],['2', '2', '2', '2', '2'], ['3', '3', '3', '3', '3']])
file.close()
结果如下所示