内置函数open获取文件对象

生成文件对象,进行创建、读写操作

用法:

open(path,mode)

参数:

  • path:文件路径
  • mode:操作模式
  • 返回值:文件对象

文件读取

文件读取操作模式:

python 得到 map value python 得到文件写入器_当前路径

文件对象的操作方法之读:

python 得到 map value python 得到文件写入器_python 得到 map value_02

创建文件b.txt,放在当前目录下,内容如下

你好 Python
hello world

例1:使用r模式

import os

# 获取当前路径
current_path =  os.getcwd()
# print(current_path)

# 获取当前目录下的文件b.txt的地址
path = os.path.join(current_path, 'b.txt')
# 打开文件
f = open(path, 'r', encoding='utf-8')

# 获取文件模式
print(f'文件模式:{f.mode}')

# 打印文件名称
print(f'文件名称:{f.name}')

# 打印文件是否关闭
print(f'文件是否关闭:{f.closed}')

# 指针移动到文件开头,r模式会自动从头开始读
# f.seek(0)
# 打印读取的文件内容
print('打印全部内容,返回字符串:')
print(f.read())

# 指针移动到文件开头
f.seek(0)
# 打印读取的文件内容
print(f'打印全部内容,返回列表:{f.readlines()}')

# 关闭文件
f.close()

# 打印文件是否关闭
print(f'文件是否关闭:{f.closed}')

结果:

python 得到 map value python 得到文件写入器_当前路径_03

例2:使用rb模式

import os

# 获取当前路径
current_path =  os.getcwd()
# print(current_path)

# 获取当前目录下的文件b.txt的地址
path = os.path.join(current_path, 'b.txt')
# 打开文件,使用rb模式,不能设置encoding='utf-8'
f = open(path, 'rb')

# 指针移动到文件开头,rb模式会自动从头开始读
# f.seek(0)
# 打印读取的文件内容,decode将其它编码的字符串解码成unicode,这样就可以正常显示中文
print(f.read().decode())

结果:

python 得到 map value python 得到文件写入器_字符串_04

若是出现错误提示:
Traceback (most recent call last):
File “E:/anzhuang/pycharm/pylearn/mytest/read.py”, line 18, in
print(f.read())
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 8: illegal multibyte sequence

解决:读取文件时使用rb模式

例3:去掉使用readlines出现的换行符和空格
文件b.txt:

你好 Python

hello world
import os

# 获取当前路径
current_path =  os.getcwd()
# print(current_path)

# 获取当前目录下的文件b.txt的地址
path = os.path.join(current_path, 'b.txt')
# 打开文件,使用rb模式,不能设置encoding='utf-8'
f = open(path, 'r', encoding='utf-8')


# 获取文件内容,返回的是列表
data = f.readlines()
print(f'文件内容:{data}')

new_data = []

# 使用strip去掉字符串左右两边的空格,这样就可以取消换行符了
for i in data:
    temp = i.strip()
    # 去掉换行符后,若是字符不为空就添加到新列表中
    if temp != '':
        new_data.append(temp)

print(f'去掉换行和空内容后:{new_data}')

结果:

python 得到 map value python 得到文件写入器_当前路径_05

文件写入

文件写入操作模式:

python 得到 map value python 得到文件写入器_字符串_06

文件对象的操作方法之写:
注:文件操作完后必须要使用close关闭文件

python 得到 map value python 得到文件写入器_当前路径_07


f.seek() 详解:

  • seek(0,0) 默认移动到文件开头或简写成seek(0)
  • seek(x,1) 表示从当前指针位置向后移x(正数)个字节,如果x是负数,则是当前位置向前移动x个字节
  • seek(x,2) 表示从文件末尾向前后移x(正数)个字节,如果x负数,则是从末尾向前移动x个字节

例1:使用w,只写,每次执行会覆盖文件中之前的内容

import os

# 获取当前路径
current_path =  os.getcwd()
print(current_path)

# 在当前路径下创建文件a.txt,设置成可读,设置编码格式utf-8,这样可以写入中文
path = os.path.join(current_path, 'a.txt')
f = open(path, 'w', encoding='utf-8')

# 文件中写入内容,\n是换行符
f.write('我是第1行\n')
f.writelines(['我是第2行\n', '我是第3行\n'])
f.close()

结果:a.txt文件

python 得到 map value python 得到文件写入器_python 得到 map value_08

例2:使用w+,可读可写

import os

# 获取当前路径
current_path =  os.getcwd()
# print(current_path)

# 在当前路径下创建文件a.txt,设置成可读,设置编码格式utf-8,这样可以写入中文
path = os.path.join(current_path, 'a.txt')
f = open(path, 'w+', encoding='utf-8')

f.write('我是第1行\n')
f.writelines(['我是第2行\n', '我是第3行\n'])
# 指针移动到文件开头
f.seek(0)
# 打印读取的文件内容
print(f.read())
# 关闭文件
f.close()

结果:

python 得到 map value python 得到文件写入器_python 得到 map value_09

例3:使用ab+模式,二进制,可读可写

import os

# 获取当前路径
current_path =  os.getcwd()
# print(current_path)

# 在当前路径下创建文件a.txt,设置成可读
path = os.path.join(current_path, 'a.txt')
f = open(path, 'ab+')

message = '我是第一行\n'
# 写入的不是str,而是经过UTF-8编码的bytes
f.write(message.encode())
f.write(b'hello')
# 指针移动到文件开头
f.seek(0)
# 打印读取的文件内容,decode将其它编码的字符串解码成unicode
print(f.read().decode())
# 关闭文件
f.close()

结果:

python 得到 map value python 得到文件写入器_当前路径_10

总结:

  • python3对bytes类型的数据用带b前缀的单引号或双引号表示
  • decode是解码,将其它编码的字符串解码成unicode
  • encode的编码,将unicode字符串编码成bytes

使用with

with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭/线程中锁的自动获取和释放等。
使用with打开文件就不需要在使用close函数来关闭文件了

例:

import os

# 获取当前路径
current_path = os.getcwd()
# print(current_path)

# 获取当前目录下的文件b.txt的地址
path = os.path.join(current_path, 'b.txt')
# 打开文件,使用rb模式,不能设置encoding='utf-8'
with open(path, 'r', encoding='utf-8') as f1:
    print(f1.read())

结果:

python 得到 map value python 得到文件写入器_字符串_11

写入和读取txt文件

import os

class Readfile:
    def __init__(self, file):
        self.file = file

    # 判断文件是否存在
    def open(self):
        if not os.path.isfile(self.file):
            raise FileNotFoundError("文件路径不存在,请检查路径是否正确:%s" % self.file)
        f = open(self.file, 'r', encoding='utf-8')
        return f

    # 写入
    def write(self, message):
        with open(self.file, 'w', encoding='utf-8') as f1:
            f1.writelines(message)

    # 读取
    def read(self, is_strip=True):
        data = []
        with self.open() as f1:
            if is_strip == True:
                for i in f1.readlines():
                    temp = i.strip()
                    if temp != '':
                        data.append(temp)
            else:
                data = f1.readlines()
        return data

if __name__ == '__main__':
    rf = Readfile('b.txt')
    s = ['第一行\n', '第二行\n']
    rf.write(s)
    print(f'打印内容:{rf.read(False)}')
    print(f'去掉换行符和空格:{rf.read()}')

结果:

python 得到 map value python 得到文件写入器_打开文件_12

写入和读取csv文件

import csv
import os

class Readcsv:
    def __init__(self,file):
        self.file = file

    #打开文件
    def open_csv(self):
        if not os.path.isfile(self.file):
            raise FileNotFoundError("文件路径不存在,请检查路径是否正确:%s" % self.file)
        wb = open(self.file,'r',encoding='gbk')
        return wb

    #读取csv文件
    def read_csv(self):
        data = list()
        readcsv = self.open_csv()
        with readcsv as f:
            reader = csv.reader(f)
            # next(reader),表示不读取第一行的数据
            # next(reader)
            for item in reader:
                data.append(item)
        return data

    #写入csv文件
    def write_csv(self,row):
        # 1. 创建文件对象
        with open(self.file,"a",newline='') as csvfile:
            # 2. 基于文件对象构建 csv写入对象
            writer = csv.writer(csvfile)
            # 3. 写入csv文件内容
            writer.writerow(row)
            # 4. 关闭文件,使用with会读完后自动关闭,这里无需再使用关闭
            #csvfile.close()

if __name__ == '__main__':

    bb = Readcsv("test_csv.csv")

    # 写入
    row = ["8", "2", "哈哈", "aa", "66"]
    bb.write_csv(row)

    # 读取
    print(bb.read_csv())
    print(type(bb.read_csv()))

结果:

python 得到 map value python 得到文件写入器_打开文件_13