笔记-7:文件和数据格式化

1.文件的使用

1.1 文件类型

  • 文件是存储在辅助存储器上的一组数据序列,可以包含任何数据内容。概念上,文件是数据的集合和抽象。 文件包括两种类型,文本文件和二进制文件。

  • 文本文件一般由单一特定编码的字符组成,如UTF-8编码,内容容易统一展示和阅读。

  • 二进制文件直接由比特0和比特1组成,文件内部数据的组织格式与文件用途有关。

  • 二进制是信息按照非字符但特定格式形成的文件,例如:png格式的图片文件,avi格式的视频文件。

  • 二进制文件和文本文件最主要的区别在于是否统一的字符编码。

  • 无论文件创建为文本文件或者二进制文件,都可以用"文本文件方式"和"二进制文件方式"打开。但打开后的操作不同。

  • 采用文本方式读入文件, 文件经过编码形成字符串, 打印出有含义的字符;

  • 采用二进制方式打开文件, 文件被解析为字节流。

1.2 文件的打开

  • python对文本文件和二进制文件采用统一的操作步骤,即"打开-操作-关闭"。

  • python3中移除了全局函数file()函数,保留了open函数。文件的打开或者创建可以使用open()函数。该函数可以指定处理模式,设置打开的文件为只读,只写或可读,可写状态。

  • 通过open()函数打开一个文件,将返回一个操作这个文件的变量file。

# 语法形式:
        <变量名> = open(<文件路径及文件名>, <打开模式>)
    
# open函数源码:
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

# 代码解析:
# file:被打开的文件名称,如果文件file不存在,open()将创建名为name的文件,然后再打开该文件。
# mode:指文件的打开模式。
# buffering:设置缓存模式。0表示不缓存,1表示行缓存;如果大于1则表示缓冲区的大小,以字节为单位。
# encoding:显示文件的编码类型。
# newline:文件使用的换行模式。
# closed:判断文件是否关闭,如果文件被关闭,返回True
  • 文件的打开模式:
模式含义
r只读模式, 如果文件不存在, 返回异常FileNotFoundError, 默认值
w覆盖写模式, 文件不存在则创建, 存在则完全覆盖源文件
x创建写模式, 文件不存在则创建, 存在则返回异常FileExistsError
a追加写模式, 文件不存在则创建, 存在则在原文件最后追加内容
b二进制文件模式
t文本文件模式, 默认值
+与r/w/x/a一同使用, 在原功能基础上增加同时读写功能

 

  • 上述打开模式中, 'r'、 'w'、 'x'、 'b'可以和'b'、 't'、 '+'组合使用, 形成既表达读写又表达文件模式的方式。
  • 对于图片,视频等文件必须使用 'b' 模式。

1.3 文件的关闭

文件使用结束后要用close()方法关闭, 释放文件的使用授权 :

<变量名>.close()

1.4 文件的读取-read

# f.read(size=-1): 从文件中读入整个文件内容。参数可选,如果给出,读入前size长度的字符串或字节流,返回字符串。

f = open(r"F:\code\shopxo\test", "r",encoding="utf-8")
r = f.read()
print(r)
print(type(r))
f.close()
# 通过控制read()参数的值,返回指定字节的内容

f = open(r"F:\code\shopxo\test", "r",encoding="utf-8")
r = f.read(5)                  # 返回前5个字节的内容
print(r)
print(type(r))
f.close()

1.5 文件的读取-readlines()

# f.readlines(hint=-1) 从文件中读入所有行,以每行为元素形成一个列表。参数可选,如果给出,读入hint行。

f = open(r"F:\code\shopxo\test", "r",encoding="utf-8")
r = f.readlines()
print(r)
print(type(r))
f.close()

1.6 文件的读取-readline()

# readline()每次读取文件中的一行,需要使用永真表达式读取文件。但当文件指针移到到文件的末尾时,依然使用readline()读取文件将出现错误,因此需要添加一个判断语句。

# redline():每次读取文件中的一行内容
f = open(r"F:\code\shopxo\test", "r",encoding="utf-8")
while True:
    r = f.readline()
    if r:
        print(r)
    else:
        break
f.close()

1.7 文件的读取-seek()

  • f.seek()方法能够移动读取指针的位置,

  • f.seek(0)将读取指针移动到文件开头,

  • f.seek(2)将读取指针移动到文件结尾。

f = open(r"F:\code\shopxo\test", "r",encoding="utf-8")
s = f.read(3)              # 读取前3个字节的内容
print(s)
f.seek(0)                # 指针移动到文件开头
ls = f.readlines()      # 一次性读取所有内容,以列表形式返回
print(ls)
f.close()

1.8 文件的读取-遍历循环

f = open(<文件路径及名称>, "r")
for line in f:
    # 处理一行数据
f.close()
f = open(r"F:\code\shopxo\test", "rt", encoding="utf-8")
for i in f:
    print(i)
f.close()

1.9 文件的读写-write()

  • f.write(s)向文件写入字符串s, 每次写入后, 将会记录一个写入指针。 该方法可以反复调用, 将在写入指针后分批写入内容, 直至文件被关闭。
data = "离离原上草,\n一岁一枯荣,\n野火烧不尽,\n春风吹又生。"
f = open(r"F:\code\shopxo\test", "w", encoding="utf-8")
f.write(data)
# f.write("离离原上草,\n")        # \n:换行
# f.write("一岁一枯荣,\n")
# f.write("野火烧不尽,\n")
# f.write("春风吹又生。\n")
f.close()

1.10 文件的读写-writelines()

# f.writelines(lines)直接将列表类型的各元素连接起来写入文件。   
data = ['新年都未有芳华,\n', '二月初惊见草芽。\n','白雪却嫌春色晚,\n','故穿庭树作飞花。']
f = open(r"F:\code\shopxo\test", "w", encoding="utf-8")
f.writelines(data)
f.close()

1.11 文件的删除

  • 文件的删除需要使用os模块和os.path模块。os模块提供系统环境,文件,目录等操作系统的接口函数。

  • os模块常用的文件处理函数:

函数含义
access(path,mode)按照mode指定的权限访问文件
chmod(path,mode)改变文件的访问权限,mode用UNIX系统中的权限代号表示
open(filename,flag[mode=0777])按照mode指定的权限打开文件,默认(用户读、写、执行的权限)
remove(path)删除path指定的文件
rename(old,new)重命名文件或目录,old表示原文件或目录,new表示新文件或目录
stat(path)返回path指定的文件的所有属性
fstat(path)返回打开的文件的所有属性
lseek(fd,pos,how)设置文件的当前位置,返回当前位置的字节数
start file(filepath[, operation] )启动关联程序打开文件。例如, 打开的是一个html文件, 将启动IE浏览器
tmpfile()创建一个临时文件,文件创建在操作系统的临时目录中

 

  • os.path模块常用的函数:
函数描述
abspath(path)返回path所在的绝对路径
dima me(p)返回目录的路径
exists(path)判断文件是否存在
getatime(filename)返回文件的最后访问时间
getctime(filename)返回文件的创建时间
getmtime(filename)返回文件最后的修改时间
getsize(filename)返回文件的大小
is abs(s)测试路径是否是绝对路径
is dir(path)判断path指定的是否是目录
is file(path)判断path指定的是否是文件
split(p)对路径进行分隔,并以列表的方式返回
split ext(p)从路径中分割文件的扩展名
split drive(p)从路径中分割驱动器的名称
walk(top, func, arg)遍历目录数, 与os.walk() 的功能相同

 

import os

a = open(r'F:\code\shopxo\test.txt', 'w')
if os.path.exists(r'F:\code\shopxo\test.txt'):   # 判断文件是否存在
    print('文件的所有属性:{}'.format(os.stat(r'F:\code\shopxo\test.txt')))
    print('文件的大小:{}'.format(os.path.getsize(r'F:\code\shopxo\test.txt')))
    os.remove(r'F:\code\shopxo\test.txt')   # 删除文件
else:
    print('文件不存在')

1.12 文件的删除

  • 没有直接提供复制文件的方法,但是可以使用read(),write()方法同样可以实现复制文件的功能。
# 创建文件:hello.txt
txt = open('hello.txt', 'w')
data = ['鹅鹅鹅\n', '曲颈向天歌']
txt.writelines(data)
txt.close()
# 创建文件:hello1.txt
txt = open('hello.txt', 'r')
txt_1 = open('hello1.txt', 'w')
txt_1.write(txt.read())
txt.close()
txt_1.close()
  • shutil模块是另一个文件,目录的管理接口,提供了一些用于复制文件,目录的函数。

  • copyfile()函数可以实现文件的复制,文件的剪切可以使用move()函数实现。

import shutil

shutil copyfile('hello.text', 'hello_1.text')   # 将hello.text内容复制给hello_1.text
shutil.move('hello.text', '../')                # 将hello.text文件移到到当前目录的父目录下
shutil.move('hello.text', 'hello_2.text')       # 修改文件名

1.13 文件内容的搜索与替换

  • 文件内容的搜索与替换通过结合字符串查找和替换来实现。
# 文件的查找
import re

f = open('hello.text', 'r')
count = 0
for s in f.readlines():                   # 每一次读取一行数据到变量s
    li = re.findall('hello', s)           # 使用findall()查询变量s,并将结果存储到列表li中
    if len(li) > 0:                       # 判断列表长度>0
        count = count +li.count('hello')  # 统计列表中'hello'出现的次数
print('查找到' + str(count) + '个hello')
f.close()
# 文件的替换
f1 = open('hello.text', 'r')
f2 = open('hello1.text', 'w')
for s in f1.readlines():
    f2.write(s.replace('hello', 'hi')) 
    # replace替换s中的'hello',然后结果写入hello1.text文件
f1.close()
f2.close()

2.目录操作 

  • python中的os模块和os.path模块提供了一些针对目录操作的函数

 2.1 创建和删除目录

  •  os中常用的目录处理函数:
函数说明
mkdir(path[,mode=0777])创建path指定的一个目录
makedirs(name, mode=511)创建多级目录,name表示为'path1/path2...'
rmdir(path)删除path指定的目录
removedirs(path)删除path指定的多级目录
listdir(path)返回path指定目录下所有的文件名
getwd()返回当前的工作目录
chdir(path)改变当前目录为path指定的目录
walk(top,topdown=True,οnerrοr=None)遍历目录树

 

# 目录的基本操作:
import os

os.mkdir("test")                      # 创建空目录
os.rmdir("test")                      # 删除空目录
os.makedirs("testinh/a")              # 创建多级空目录
os.removedirs("testinh/a")            # 删除多级空目录
print(os.getced())                    # 获取当前所在目录

2.2 目录的遍历

 目录的遍历有两种实现方法:递归函数、os.walk()

# 递归函数
import os

def VisitDir(path):
    li = os.listdir(path)                     # 获取路径下所有的目录名和文件名
    for p in li:                            
        pathname = os.path.join(path, p)      # 获取文件的完整路径
        if not os.path.isfile(pathname):      # 判断pathname是否为文件
            VisitDir(pathname)                # 如果pathname为目录,则继续遍历
        else:
            print(pathname)

if __name__ == '__main__':
    path = r'F:\pycharm\Demo'
    VisitDir(path)
# os.walk()用于目录的遍历,功能类似于os.path模块的函数walk()
import os

def VisitDir(path):
    for root, dirs, files in os.walk(path):
        for filepath in files:
            print(os.path.join(root, filepath))

if __name__ == '__main__':
    path = r'F:\pycharm\Demo'
    VisitDir(path)

3.数据组织的维度

  • 一组数据在被计算机处理前需要进行一定的组织,表明数据之间的基本关系和逻辑, 进而形成“数据的维度”

  • 根据数据的关系不同, 数据组织可以分为: 一维数据、 二维数据和高维数据。

  • 一维数据:由对等关系的有序或无序数据构成, 采用线性方式组织 。例如:北京、 上海、 天津、 重庆 。

  • 二维数据:由关联关系数据构成,采用二维表格方式组织 。例如:excel表格。

  • 高维数据:由键值对类型的数据构成, 采用对象方式组织, 可以多层嵌套。 例如:HTML,XML,json数据

3.1 一维数据

  • 一维数据由于是线性结构, 在Python语言中主要采用列表形式表示。

  • 一维数据的文件存储有多种方式, 总体思路是采用特殊字符分隔各数据。

  • 常用存储方法包括4种。

    1. 采用空格分隔元素 。

    2. 采用逗号分隔元素 。

    3. 采用换行分隔包括 。

    4. 其他特殊符号分隔。

  • 逗号分割的存储格式叫做CSV格式 ,一维数据保存成CSV格式后, 各元素采用逗号分隔, 形成一行。 从Python表示到数据存储, 需要将列表对象输出为CSV格式以及将CSV格式读入成列表对象 。
# 一维数据的存储:列表对象输出为CSV格式文件
ls = ['北京', '上海', '天津', '重庆']
f = open('city.csv', 'w')
f.write(','.join(ls)+'\n')
f.close()
# 一维数据的处理:将CSV格式文件,读入一维数据, 并将其表示为列表对象。
f = open('city.csv','r')
ls = f.read().strip('\n').split(',')
f.close()
print(ls)

3.2 二维数据

  • 二维数据可以采用二维列表来表示, 即列表的每个元素对应二维数据的一行, 这个元素本身也是列表类型, 其内部各元素对应这行中的各列值 。

  • 二维数据由一维数据组成, 用CSV格式文件存储。CSV文件的每一行是一维数据, 整个CSV文件是一个二维数据。

# 二维列表对象输出为CSV格式文件
ls = [
    ['指标', '2014年', '2015年', '2016年'],
    ['居民消费价格指数', '102', '101.4', '102'],
    ['食品', '103.1', '102.3', '104.6'],
    ['烟酒及用品', '994', '102.1', '101.5'],
    ['衣着', '102.4', '102.7', '101.4'],
    ['家庭设备用品', '101.2', '101', '100.5'],
    ['医疗保健和个人用品', '101.3', '102', '101.1'],
    ['交通和通信', '99.9', '98.3', '98.7'],
    ['娱乐教育文化', '101.9', '101.4', '101.6'],
    ['居住', '102', '100.7', '101.6'],
]    
f = open('cpi.csv', 'w')
for row in ls:
    f.write(','.join(row)+'\n')
f.close()
# 从CSV文件读取二维数据
f = open('cpi.csv', 'r')
ls = []
for line in f:
    ls.append(line.strip('\n').split(','))
f.close()
print(ls)
# 二维数据处理为表格形式
for row in ls:
    for item in row:
        <对第row行第item列元素进行处理>
        
# 对二维数据进行格式化输出, 打印成表格形状
f = open('cpi.csv', 'r')
ls = []
for line in f:
    ls.append(line.strip('\n').split(','))
f.close()
for row in ls:
    line = ''
    for item in row:
        line += '{:12}\t'.format(item)
    print(line)

转载于:https://www.cnblogs.com/Cyzhouke/p/11445538.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值