«

python 文件的的读写

时间:2023-3-1 22:23     作者:wen     分类: Python


打开文件使用 open函数, 可以打开一个已经存在的文件, 或者出具一个新文件

语法: open(文件名称, 打开模式)

字符 意义
'r' 读取(默认)
'w' 写入,并先截断文件
'x' 排它性创建,如果文件已存在则失败
'a' 写入,如果文件存在则在末尾追加
'b' 二进制模式
't' 文本模式(默认)
'+' 打开用于更新(读取与写入)

默认模式为 'r' (打开用于读取文本,与 'rt' 同义)。 模式 'w+' 与 'w+b' 将打开文件并清空内容。 模式 'r+' 与 'r+b' 将打开文件并不清空内容。

# 文件操作
# 默认编码GBK
fp = open('test.txt', 'w+', encoding='utf-8')  # 指定编码

# 开始操作 读/写操作
fp.write('飞流直下三千尺疑是银河落九天')
fp.close()  # 关闭文件, 释放资源

# 二进制方式写入
fp = open('test1.txt', 'wb')
fp.write('床前明月光,疑似地上霜\n'.encode('utf-8'))
fp.close()

# 文件追加
fp = open('test1.txt', 'a', encoding='utf-8')
fp.write('举头望明月,低头思故乡\n')
fp.write('诗人:李白\n')
fp.close()

# 文件的读
fp = open('test1.txt', 'r', encoding='utf-8')
# print(fp.read())  # 把文件读成字符串
# print(fp.readline())  # 读一行
# print(fp.readline())
# print(fp.readline())
print(fp.readlines())  # 读成列表
# ['床前明月光,疑似地上霜\n', '举头望明月,低头思故乡\n', '诗人:李白\n']
fp.close()

# 二进制读
fp = open('test1.txt', 'rb')
data = fp.read()
print(data.decode('utf-8'))
fp.close()

# with 上下文管理
# with 语句, 不管在处理文件过程中是否发生异常, 都能保证 with 语句执行完毕后已经关闭打开的文件句柄.

with open('test1.txt', 'r', encoding='utf-8') as fp:
    fp.read()
    pass

# 文件备份
def copy_file():
    # 接受用户输入文件名
    old_file = input('输入文件名: ')
    file_list = old_file.split('.')
    # 构造新的文件名.加上备份的后缀
    new_file = file_list[0] + "_备份." + file_list[1]
    old_f = open(old_file, 'r', encoding='utf-8')  # 已读的方式打开文件

    new_f = open(new_file, 'w', encoding='utf-8')  # 已读的方式打开文件, 不存在,就创建
    content = old_f.read()  # 读取文件内容
    new_f.write(content)  # 写入内容数据

    old_f.close()
    new_f.close()

    pass

# copy_file()

# 如果文件超大, 一次读取全部内容显然不合适, 备份大文件
def copy_big_file():
    # 接受用户输入文件名
    old_file = input('输入文件名: ')
    file_list = old_file.split('.')
    # 构造新的文件名.加上备份的后缀
    new_file = file_list[0] + "_备份." + file_list[1]
    try:
        # 同时打开文件需要备份的文件, 新文件
        with open(old_file, 'r', encoding='utf-8') as old_f, open(new_file, 'a', encoding='utf-8') as new_f:
            while True:
                # 一次读取1024字符
                content = old_f.read(1024)
                new_f.write(content)
                # 当读取的内容字符长度小于1024说明已经读取完毕
                if len(content) < 1024:
                    break
                pass
            pass
    except Exception as e:
        print(e)
    pass
copy_big_file()

文件定位

tell 返回指针当前所在的位置

# tell 返回指针当前所在的位置
# 对中文来说, gbk 占2个字符, utf8 占3个字符
# truncate 可以对源文件进行截取操作 还行要r+
# with open('test1.txt', 'r+', encoding='utf-8') as f:
#     # print(f.read(1))
#     # print(f.tell())
#     f.truncate(9)
#     print(f.read())
#     pass

# seek 文件定位
# seek(offset, from) 有2个参数, offset, 偏移量单位字节, 负数是往回偏移, 正数是往前偏移, form位置:0表示文件开头, 1表示当前位置, 2表示文件末尾

f = open('test1.txt', 'rb')
content = f.read(3)  # 读取3个位置
print(content.decode('utf-8'))
f.seek(-3, 1)  # 在前期位置往回偏移两个字节
print(f.read().decode('utf-8'))