Python基础—文件的读写操作

一、文件的操作

1.文件初识

文件的概念

  • 数据的抽象和集合
  • 存储在存储器上的数据序列
  • 一种数据存储形式
  • 形态:二进制和文本文件

文本文件和二进制文件

  • 文本文件:由单一特定的编码组成的文件,如utf-8,存储着的长字符串
  • 二进制文件:直接有比特0和1组成,没有同意的字符编码;一般存在二进制0和1的组织结构,即文件格式;如png,avi

2.文件的操作

操作流程

  1.给定文件路径打开,产生一个数据流(文件句柄)。

  2.对数据流(文件句柄)进行相应的操作。

  3.关闭数据路(文件句柄)

# 1. 打开文件,得到文件句柄并赋值给一个变量
f = open('D:\PyCharmProject\python全栈S20\day007\\file_read.txt', 'r', encoding='utf-8')

# 2. 通过句柄对文件进行操作
print(f.read())

# 3. 关闭文件
f.close()

 

# 第二种打开反方式 with open
# with open(filename, mode, encoding) as f:
#        f.read()  # 注意缩进

# 打开多个文件
with open(filename1, mode, encoding) as f1,\
    open(filename2, mode, encoding) as f2:

with open('a.txt','rt',encoding='utf-8') as f:
    f.read()

# 缺点:当在打开文件中继续操作文件时,可能由于执行语句没有执行关闭文件,下面继续调用会出现报错(IOError)

打开文件的坑:

1.路径问题

  1.'\'与不同的字母或数字会有特殊的含义,导致系统读取路径时当成别的含义

  2.解决方法:路径前面加一个r,使字符串变为原始字符串,或者在有歧义的'\'前面加一个'\'进行转义。

2.编码问题:UnicodeDecodeError

  编码要与文件存储时的编码模式保持一样 

文件的打开方式:

文件的读操作

'''
文件的写:
    写入方法:
         w:创建写模式:文件名不存在,则创建写;存在则清空内容在写入
         wb:以二进制的方式创建写入
         w+:写读模式,可写可读
f = open(filename, mode, encoding)
'''


# w:创建写模式,文件名不存在,则创建写;存在则清空内容在写入
f = open('file_write.txt', 'w', encoding='utf8')

f.write('i am handsome!\n')
f.write('i am handsome!\n')
f.write('i am handsome!\n')
f.write('i am handsome!\n')

f.close()


'''
非字符内容的读取和复制
'''
# 以二进制方式读入非字符内容
f1 = open('bueaty.jpg', 'rb')
content = f1.read()
f1.close()

# 以二进制方式写入非字符内容
f2 = open('bueaty_copy.jpg', 'wb')
f2.write(content)
f2.close()

文件的写入操作

'''
读的方法
f = open(filename, mode, encoding)
1.全部读取
    f.read()
2.r只读模式下;r模式下,n单位为字符,rb模式下,n单位为字节
    f.read(n)
3.按行读取
    1.读取单行
        r.readline()
    2.读取多行,返回一个列表类型
        r.readlines()
    3.如果指定了一个非负数的参数,则返回指定大小的字符数,包括 "\n" 字符。
        r.readline(n)
4.循环读取:最优读法,每次在内存中只读取一行,读完转换后会释放内存。
    for line in f.readlines():
        print(line)
'''


f = open("file_read.txt", encoding='utf-8')

# 1.读取全部内容
data = f.read()

# 2.读取单行
data = f.readline()

# 3.读取多行,返回一个列表类型
data = f.readlines()

# 3.读取前多少行
data = f.readline(5)

print(data)

f.close()

文件的追加操作

'''
文件的追加:
    追加写入方法:
         a:创建写模式:文件名不存在,则创建写;存在则清空内容在写入
         ab:以二进制的模式追加写入
         a+:可追加写,可读
f = open(filename, mode, encoding)
'''

data = 'asdfasdf'
lis = ['asd','sadf','adsf']
with open('file_write.txt','a',encoding='utf-8') as f:
    f.write(data)  # 在文件末追加写入
    f.writelines(lis)  # 在文件末写入多行

文件的其他操作方法:

'''
对文件句柄(数据流)的操作方法
f = open(filename, mode, encoding)

f.read(): 读取全部内容
f.readline(): 读取单行
f.readlines(): 读取多行

f.close(): 关闭文件
f.flush(): 刷新文件,更新改动内容

f.readable(): 判断文件是否可读
f.writable(): 判断文件是否可写
f.seekable(): 判断光标是否可指定

f.seek(n): 根据字节数指定当前光标位置
f.tell(): 获取当前光标在文件中的位置
    seek tell应用于网络编程:FTP的作业,断电续传的功能。

f.truncate(size): 对原文件根据字节大小进行截取,必须在句柄可写(r+)的情况下使用,使用r+模式

'''

# f.truncate()

# f = open('other_operate.txt', 'r+', encoding='utf8')
# f.seek(3)  # 调整光标对truncate方法不管用
# f.truncate(9) # truncate截取都是从文件最开始位置进行截取,以字节为单位。
# f.close()

'''
总结:
    最常用的几个方法:read seek tell flush readable writeable
'''


'''
打开文件的第二种方法:
with open(filename, mode, encoding) as f:
    f.read()  # 注意缩进

优点
    1.省略f.close()
    2.一个with open语句可以操作多个文件句柄

with open(filename1, mode, encoding) as f1,\
        open(filename2, mode, encoding) as f2:

缺点: 当在打开文件中继续操作文件时,可能由于执行语句没有执行关闭文件,下面继续调用会出现报错(IOError)
    with open(filename1, mode, encoding) as f1:
        对文件的处理
        f.close()
        with open(filename2, mode, encoding) as f2:
            pass
'''

with open('file_read.txt', encoding='utf-8') as f:
    data = f.read()
    print(f.tell())
    print(data)

3.文件的修改操作原理

# 1.以读的模式打开一个源文件
# 2.以写的模式创建一个新文件
import os

# 方法一
with open('file_modify.txt', encoding='utf-8') as f1,\
        open('file_modify1.txt', 'w', encoding='utf-8') as f2:

        # 3.将原文件内容读取出来,按照你的要求改成新内容,写入新文件
        # old_content = f1.read() # 慎用read()读取全部,推荐使用for
        # new_content = old_content.replace('alex', 'sb')
        # f2.write(new_content)
        for line in f1.readlines():
            new_line = line.replace('alex', 'sb')
            f2.write(new_line)

# 4.删除原文件
os.remove('file_modify.txt')


# 5.将新文件重命名为原文件
os.rename('file_modify1.txt', 'file_modify.txt')

# 或者
os.replace('file_modify.txt', 'file_modify.txt')



# 方法二
with open('file_modify.txt', 'r+', encoding='utf-8') as f:
    file = f.read()
    f.seek(0)
    f.write(file.replace('sb', 'alex'))

 

posted @ 2019-03-20 18:04  ryxiong728  阅读(383)  评论(0编辑  收藏  举报