Python基础(七):文件与数据格式化

文件和数据格式化

7.1 文件

7.1.1 文件类型

  1. 文件是数据的抽象和集合

  2. 文件的展示方式

    • 本质上,文件都是二进制存储
    • 形式上,文件有两种展示方式
      • 文本文件:由单一特定编码组成的文件,也被看成是存储的长字符串,例如 txt 文件、.py 文件。
      • 二进制文件:二进制 01 组成,没有统一字符编码,例如 .png 文件。

7.1.2 文件的打开与关闭

  1. 打开文件:

    • open(filename, mode='r') 打开一个文件,并返回文件对象。

      • filename: 必需,文件路径(相对路径或绝对路径)。
      • mode: 可选,文件打开模式
    • 文件打开模式(mode 参数)

      参数 模式
      "r" 只读模式(默认)
      "w" 覆盖写,文件不存在则创建,存在则覆盖
      "x" 创建写,文件不存在则创建,存在则报错
      "a" 追加写,文件不存在则创建,存在则追加
      "t" 文本模式(默认)
      "b" 二进制模式
      "+" 与 r/w/x/a 一起使用,打开一个文件进行更新(可读可写)。
  2. 关闭文件:

    • fileObject.close() 关闭一个已打开的文件。

      • 关闭后的文件不能再进行读写操作,
      • 没有参数,没有返回值

    python对文件的操作步骤:打开→操作→关闭

    打开文件后采用 close() 关闭文件是一个好习惯。如果不调用 close(),当前 Python 程序完全运行退出时,该文件引用被释放,即程序退出时,相当于调用了 close()

7.1.3 文件读取

函数 说明
file.read(size=-1) 读取所有,作为一个字符串。如果给定 size 则读取前 size 长度。
file.readline(size=-1) 读取整行,包括 "" ,如果给定 size 则读取该行的前 size 长度。
file.readlines(sizeint=-1) 读取所有行,以每行为元素返回列表,如果给定 sizeint 则读取前 sizeint 行。
# 实例

# 遍历全文本:方法一
# 特点:一次读入,统一处理
file = open("f1.txt", "r")
txt = file.read()
file.close()
# 遍历全文本,方法二
# 特点:按数量读入,逐步处理
file = open("f1.txt", "r")
txt = file.read(5)
while txt != "":
    txt = file.read(5)
file.close()
# 逐行遍历:方法一
file = open("f1.txt", "r")
ls = file.readlines()
for line in ls:
    print(line)
file.close()
print(ls)
Who's there?

hello

python
["Who's there?\n", 'hello\n', 'python']  
# 逐行遍历:方法二
file = open("f1.txt", "r")
ls = []
for line in file:  # 读取每行为一个字符串
    print(line)
    ls.append(line)
file.close()
print(ls)
Who's there?

hello

python
["Who's there?\n", 'hello\n', 'python']

7.1.4 文件写入

函数 说明
file.write(s) 字符串 s 写入文件,返回写入的字符长度。
file.writelines(lines) 向文件写入一个字符串列表 lines,如需换行则要自己加入每行的换行符。
file.tell() 返回文件指针的当前位置。
file.seek(offset[, whence]) 将文件指针移动到指定位置。

file.seek(offset[, whence])

offset — 偏移量

whence — 从文件哪个位置开始偏移(可选,默认为0)

  • 0 → 从文件开头开始,1 → 从文件当前位置开始,2 → 从文件结尾开始
# tell()与seek()
file = open("f1.txt", "rb")
print(file.tell())
file.read(5)
print(file.tell())
file.seek(20, 1)
print(file.tell())
0
5
25
# 注意:Pyhon3 在文本文件中,如果没有使用 b 模式打开文件,
# 那么只允许从文件头开始计算相对位置,从其它位置开始就会引发异常。
# io.UnsupportedOperation: can't do nonzero cur-relative seeks
file = open("f1.txt", "rb")
file.read(5)
print(file.tell())
file.seek(20, 1)
5

25
# 实例
# 数据写入到文件的操作
file = open("f1.txt", "w+")
ls = ["Who's there?\n", "hello\n", "python"]
file.writelines(ls)
for line in file:
    print(line)
file.close()
# 没有任何输出
# 修改代码
file = open("f1.txt", "w+")
ls = ["Who's there?\n", "hello\n", "python"]
file.writelines(ls)
print(file.tell())
file.seek(0) # 文件指针回到文件头
for line in file:
    print(line, end="")  # 读取一行会将末尾换行符也读取
file.close()
27
Who's there?
hello
python

7.2 一维数据的格式化和处理

  1. 数据组织的维度

    • 一维数据:由对等关系的有序或无序数据构成,采用线性方式组织,例如集合、列表
    • 二维数据:一维数据的组合形式
    • 多维数据:由一维或二维数据在新维度的扩展
    • 高维数据:仅利用最基本的二元关系展示数据的复杂结构,例如字典
  2. 一维数据的表示

    • 数据有序:列表
    • 数据无序:集合
  3. 一维数据的存储

    • 方式一:空格分隔进行存储,不换行。缺点:数据中不能有空格
    • 方式二:逗号分隔进行存储,不换行。缺点:数据中不能有逗号
    • 其他方式:特殊符号或符号组合
  4. 一维数据的处理:指的是表示方式与存储方式的相互转换

# 1.从空格分隔的文件读取数据
file = open("data1.txt", "r")
txt = file.read()
ls = txt.split()
file.close()
ls
['Thu', 'Nov', '17', '15:13:13', '2022']
# 2.采用空格分隔方式将数据写入文件
txt = " ".join(ls)
file = open("data1.txt", "w")
file.write(txt)
file.close()

7.3 二维数据的格式化和处理

  1. 二维数据的表示

    • 基本方式:二维列表
  2. CSV格式与二维数据的存储

    1. 逗号分隔值(Comma-Separated Values,CSV):通用的一二维数据存储格式,.csv 扩展名

      • 每行一个一维数据,采用逗号分隔,无空行
      • 如果某个元素缺失,逗号仍要保留
      • 英文半角逗号,逗号与数据之间无额外空格
      • 暂时不考虑数据中出现逗号的情况(加引号、转义符)
    2. 二维数据的存储:一般索引习惯为ls[row][column]

  3. 二维数据的处理

    • Python 提供了一个读写 csv 的标准库,可以通过 import csv 使用。csv 库包含操作 CSV 格式最基本的功能,csv.reader 和 csv.writer().
    • 由于 CSV 格式十分简单,对于一般程序来说,建议程序员自己编写操作 CSV 格式的函数,这样更灵活和个性化。
    • 对于需要运行在复杂环境或商业使用的程序,建议采用 csv 标准库。
# 从CSV格式的文件读取数据
ls = []
file = open("sample1.csv", "r")
for line in file:
    line = line.replace("\n", "")
    lt = line.split(",")
    ls.append(lt)
file.close()
# 打印
for item in ls:
    print(item)
['"Month"', '"Average"', '"2005"', '"2006"', '"2007"', '"2008"', '"2009"', '"2010"', '"2011"', '"2012"', '"2013"', '"2014"', '"2015"']
['"May"', '0.1', '0', '0', '1', '1', '0', '0', '0', '2', '0', '0', '0']
['"Jun"', '0.5', '2', '1', '1', '0', '0', '1', '1', '2', '2', '0', '1']
['"Jul"', '0.7', '5', '1', '1', '2', '0', '1', '3', '0', '2', '2', '1']
['"Aug"', '2.3', '6', '3', '2', '4', '4', '4', '7', '8', '2', '2', '3']
['"Sep"', '3.5', '6', '4', '7', '4', '2', '8', '5', '2', '5', '2', '5']
['"Oct"', '2.0', '8', '0', '1', '3', '2', '5', '1', '5', '2', '3', '0']
['"Nov"', '0.5', '3', '0', '0', '1', '1', '0', '1', '0', '1', '0', '1']
['"Dec"', '0.0', '1', '0', '1', '0', '0', '0', '0', '0', '0', '0', '1']
# 将二维数据写入CSV格式文件
file = open("sample1.csv", "w")
for item in ls:
    file.write(",".join(item) + "\n")
file.close()

代码中用到的文件:

链接:https://pan.baidu.com/s/1yQ5a3NQS8LxYagRyQSvs1A?pwd=c31g 提取码:c31g


Python基础(七):文件与数据格式化
https://luminous-ee.github.io/2023/01/26/Python基础(七):文件与数据格式化/
作者
落与
发布于
2023年1月26日
许可协议