【python基础(九)】文件系统:文件读写、文件打开模式、改变游标

本文将学到:

  • 如何打开文件
  • 如何一次性读取整个文件,以及如何以每次一行的方式读取文件的内容;
  • 如何写入文件,以及如何将文本附加到文件末尾;

文件概述

  • 文件是存储在辅助存储器上的的数据序列,是数据的集合和抽象。
  • 一个文件需要有唯一确定的文件标识,文件标识包括:文件路径、文件名、文件拓展名。
  • 文件按编码方式分为文本文件、二进制文件两类。

 

一. 从文件中读取数据

要使用文本文件中的信息,首先需要将信息读取到内存中。为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。

1. 读取整个文件

pi_digits.txt
3.1415926535
  8979323846
  2643383279

if __name__ == '__main__':
    with open('pi_digits.txt') as file_object:
        contents = file_object.read()
    print(contents)
操作说明
a. 接收文件参数open接收文件名称。 Python在当前执行的文件所在的目录中查找指定的文件。
b. 创建文件实例with open('pi_digits.txt') as file_object 返回一个表示文件pi_digits.txt的对象,并将该对象赋给file_object。关键字with在不再需要访问文件后将其关闭。
c. 打开和关闭文件使用关键字with时,文件流会自动关闭
d. 读取文件使用方法read()读取这个文件的全部内容,并将其作为字符串赋给变量contents。
e. 处理空行read()到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除多出来的空行,可在函数调用print()中使用rstrip():
with open('pi_digits.txt') as file_object:
    contents = file_object.read()

print(contents.rstrip())

 

2. 文件读取的方式

当文件被打开之后,按照开发方式的不同对文件进行相应的读写操作。

  • 如果文件用文本文件打开,读写按照字符串的方式进行操作,使用当前计算机使用的编码或指定编码
  • 如果使用二进制方式打开,读写方式按照字节流方式操作。

如下三个常用的文件读取方法:

方法说明
file.read(size)read()方法默认读取全部内容。size表示读取的字节数
file.readline(size)默认从文件中读取整行,包含“\n”字符。参数size非负,则返回指定大小的字节数。“\n”算一个字符,但注意一次只读取一行内容。
file.readlines(hint)默认读取所有行,每行为列表中的一个元素。若参数hint小于等于0,于默认一致。

read方法

# Python采用解释器内置的open()函数打开一个文件,并实现该文件 与一个程序变量的关联。
# 文件名、打开模式、文件编码
f=open('example.txt','r', encoding='utf-8')

打开模式用于控制使用何种方式打开文件。如下7种打开模式
在这里插入图片描述

 

readline方法

默认一次读取整行,包括"\n",参数hint说明如下:
a. 为负数读取整行内容
b. 非负,返回指定大小的字符数,但只读一行内容

f = open('runoob.txt', 'r', encoding='utf8')
line1 = f.readline()
print('读取第一行:%s' % line1)
line2_1 = f.readline(5)
print('第二行读入5个字符是:%s' % line2_1)
line2_2 = f.readline(12)
print('接着第二行读入12个字符是:%s' % line2_2)
line3 = f.readline(20)
print('第三行读入20个字符是:%s' % line3)
f.close()

 

readlines方法

用于从文件或流中一次性读取多行数据,返回数据存入下一个列表中。

参数hint用于查询的字节数

  1. 在文本文件模式下,字符数量是以unicode编码的字符集的字符为单位来计算,及支持多字节的字符,如中文一个汉字表示一个字符,并且计算数量时剔除了换行符。
  2. 在二进制模式下,字符数量是以ASCII码对应的单字节为单位来计算,不剔除换行符\n,\n占一个字节长度。
  3. 如果hint大于前n行的总字数但小于前n+1行的总字数,则执行函数会读取文件的前n+1行
  4. 当hint<=0时,会读取整个文件的内容
with open('runoob.txt', 'r', encoding='utf8') as f:
    content = f.readlines()
    print('全部字符串:%s' % content)
with open('runoob.txt', 'r', encoding='utf8') as f:
# 返回20个字节的内容,如果一行没有20字节,则返回两行
    content = f.readlines(20)
    print('读取的字符串是:%s' % content)

 

 

3. 文件路径

相对路径
例如,你可能将程序文件存储在了文件夹python_work中,而该文件夹中有一个名为text_files的文件夹用于存储程序文件操作的文本文件。

可以使用相对文件路径来打开其中的文件,该位置是相对于当前运行的程序所在目录的。

with open('text_files/filename.txt') as file_object:

绝对文件路径
将文件在计算机中的准确位置告诉Python,这样就不用关心当前运行的程序存储在什么地方了。这称为绝对文件路径。

file_path = '/home/ehmatthes/other_files/text_files/_filename_.txt'
with open(file_path) as file_object:

 

二. 写入文件

1. write和writelines

python提供了两个与文件内容写入的有关方法

方法含义
file.write(s)向文件中写入(s)一个字符串或字节流 。返回为本次写入文件的字节流
file.writelines(lines)将一个元素全为字符串的列表(lines)写入文件

with open('write.txt', 'w') as f1:
    f1.write('1:www.runoob.com\n')
with open('write.txt', 'w') as f1:
    num = f1.write('2:www.runoob.com\n')  # 看下write()的返回值
    print(num)  # 16

with open('write.txt', 'w') as f1:
    f1.write('1:www.runoob.com\n')
with open('write.txt', 'a') as f1:
    num = f1.write('2:www.runoob.com\n')  # 看下write()的返回值
    print(num)  # 16



with open('write.txt', 'w') as f2:
    li = ['basketball\n', 'baseball\n', 'football\n', 'volleyball\n']
    f2.writelines(li)

 

2. 写入模式

    with open('pi_digits.txt','w') as file_object:
        file_object.write("I love python")
  1. 实参一也是要打开的文件的名称。
  2. 实参二(‘w’)告诉Python,要以写入模式打开这个文件。
    – 打开文件时,可指定读取模式(‘r’)、写入模式(‘w’)、附加模式(‘a’)或读写模式(‘r+’)。如果省略了模式实参,Python将以默认的只读模式打开文件。
    – 如果要写入的文件不存在,函数open()将自动创建它。然而,以写入模式(‘w’)打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件的内容。

1. 注意转换数值为str

Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式。

 

2. 不会自动添加换行符:

注意:函数write()不会在写入的文本末尾添加换行符,

    with open('programming.txt', 'w') as file_object:
        file_object.write("I love programming.\n")
        file_object.write("I love creating new games.\n")

要让每个字符串都单独占一行,需要在方法调用write()中包含换行符。

 
3. 附加到文件

如果要给文件添加内容,而不是覆盖原有的内容,可以以附加模式打开文件。

    with open(filename, 'a') as file_object:
        file_object.write("I also love finding meaning in large datasets.\n")
        file_object.write("I love creating apps that can run in a browser.\n")

 

三. 文件系统其他API

方法说明
file.flush刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件
file.seek(offset,whence)设置文件当前操作指针的位置,offset是开始的偏移量,whence表示从那个位置开始偏移
file.tell返回文件当前操作指针的位置,返回值非负,表示当前指针相对开始位置的偏移量
file.truncate(size)截取文件,截取的字节通过size指定,默认为当前文件位置

seek将文件指针移动到指定位置,tell获取当前指针位置,他们配合使用。

# 打开一个文件
from io import SEEK_END
file = open('workfile.txt', 'r')
# 移动文件指针到文件开头
file.seek(0)

# 读取文件的前 10 个字符
content = file.read(10)
print(content)  # 输出文件前 10 个字符

# 移动文件指针到文件末尾
file.seek(0, SEEK_END)

# 获取文件末尾的偏移量
end_position = file.tell()
print(f"End position: {end_position}")

# 关闭文件
file.close()

# 以读写模式打开文件
file = open('example.txt', 'r+')

# 读取文件内容
content = file.read()
print("Original content:")
print(content)

# 截断前 10 个字符
file.truncate(10)

# 将文件指针移动到文件开头并重新读取内容
file.seek(0)
modified_content = file.read()
print("\nModified content:")
print(modified_content)

# 关闭文件
file.close()


# Original content:
# 0123456789abcdef

# Modified content:
# 0123456789

 

四. 存储数据

模块json让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据

1. 使用json.dump()和json.load()

第一个程序将使用json.dump()来存储这组数,而第二个程序将使用json.load()。

if __name__ == '__main__':
    # 写入文件
    numbers = [2, 3, 5, 7, 11, 13]
    filename = 'numbers.json'
    with open(filename, 'w') as f:
        json.dump(numbers, f)
    # 读文件
    with open(filename) as f:
        numbers_read = json.load(f)
        print(numbers_read)

 

2. 保存和读取用户生成的数据

import json

if __name__ == '__main__':
    # 如果以前存储了用户名,就加载它。
    # 否则,提示用户输入用户名并存储它。
    filename = 'username.json'
    try:
        with open(filename) as f:
            username = json.load(f)
    except FileNotFoundError:
        username = input("What is your name? ")
        with open(filename, 'w') as f:
            json.dump(username, f)
            print(f"We'll remember you when you come back, {username}!")
    else:
        print(f"Welcome back, {username}!")

 
参考:《Python编程:从入门到实践(第二版)》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roman_日积跬步-终至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值