IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 9、python——文件操作 -> 正文阅读

[Python知识库]9、python——文件操作

目录

1、了解文件基本概念

1.1、什么是文件?

1.2、两种重要的文件类型

1.3、文本文件与二进制文件的优缺点

1.3.1、当文本中,中文多的话可以使用gbk存储

1.3.2、如何查看unicode(万国码)?

1.4、python3中的字符串类型

1.5、文件的缓冲机制

1.5.1、文件缓冲区

1.5.2、缓冲机制的好处

2、文件的基本操作

2.1、访问文件操作过程

2.2、打开文件

2.3、encoding

2.3.1、常见编码

2.4、打开文件

2.4.1、with管理语句

2.5、读取文件?

2.5.1、关于读的时候,光标的问题

2.5.2、移动光标

2.5.3、readline()

2.5.4、readlines()

2.6、写操作

2.6.1、为什么不实时写入磁盘

2.6.2、什么时候会写入磁盘

2.7、文件对象其他方法


1、了解文件基本概念

1.1、什么是文件?

文件是存放在外部介质 (如硬盘、U盘) 上的一组完整信息的集合。这些信息可为各种文字、
图形、图像、电影、音乐,甚至包括病毒程序等。

1.2、两种重要的文件类型

? 文本文件(Text File) 。文本文件是可直接阅读的,使用记事本打开即可看到文件的内
容。
? 二进制文件(Binary File) 。这类文件将数据按照它的进制编码的形式存储。如BMP。由
于这类文件内容是二进制编码,使用记事本打开是显然是乱码,BMP可用图片查看器解
码。

1.3、文本文件与二进制文件的优缺点

文件读取形式优点缺点
文本输出内容友好,不需要手动转换
一个字符占一个字节,文件占用的存储空间
较多, 读写时需要转换(内存->显示)
访问的时效率不高
二进制
二进制文件中的数据与数据的内存中的
表现形式一致。二进制文件在存储数据
时非常紧凑, 占用存储空间较少 ;在
写时不需要进行转换 ,具有较高的时间
效率
二进制文件 无法直接以字符形式输出 ,必须
要经过一个转换过程

?无论什么类型的文件,在硬盘或者内存中都是以二进制存放

1.3.1、当文本中,中文多的话可以使用gbk存储

在uft-8中,一个中文字符是3到4个字节,一般来说是三个字节。gbk中是两个字节

>>> "中".encode("utf8")
b'\xe4\xb8\xad'  三个字节
>>> "中".encode("GBK")
b'\xd6\xd0'   两个字节;b表示bytes类型,也就是二进制
>>> "中".encode("gbk").decode('gbk')
'中'  # 用什么加码就用什么解码  ???
python2的编码是ascii码,python3的默认编码是utf8

1.3.2、如何查看unicode(万国码)?

[root@fttsaxf ~]# python3
>>> ord('中')
20013
>>> ord('国')
22269

1.4、python3中的字符串类型

bytes()和str()

?注意:encode编码时可指定任何合适的编码方式,但decode解码时,一定需要对应的编码方式

1.5、文件的缓冲机制

读操作: 不会直接对磁盘进行读取,而是 先打开数据流 ,将磁盘上的文件信息 拷贝到缓冲区 内,然后程序再 从缓冲区中读取 所需数据
写操作: 不会马上写入磁盘中,而是 先写入缓冲区 ,只有在缓冲区已满或“关闭文件”时,才会将数
据写入磁盘

1.5.1、文件缓冲区

计算机系统为要处理的文件 在内存中单独开辟出来的一个存储区间 ,在读写该文件时,做为数据交换的临时“存储中转站”。

1.5.2、缓冲机制的好处

能够有效地减少对外部设备的频繁访问,减少内存与外设间的数据交换,填补内、外设备的速度差异,提高数据读写的 效率

2、文件的基本操作

2.1、访问文件操作过程

打开文件、读取文件(将信息读到内存中)、写入文件、关闭文件(保存文件并释放空间)

2.2、打开文件

open(file, mode='r', buffering=-1, encoding=None, erroes=None, newline=None,closedfd=True, opener=None)

file,是要打开的文件名或者路径;mode,是打开的方式;encoding,是文件的编码方式;buffering,是缓存方式;

2.3、encoding

为什么需要编码?

对于计算机来说,所有信息都是由0和1组成的二进制。 人类无法仅用二进制就来完成计算机的各种操作;字符编码解决人与计算机之间的沟通问题。

2.3.1、常见编码

# bash查看文件编码方式
[root@fttsaxf rough_book]# vim utf-8.txt
[root@fttsaxf rough_book]# file utf-8.txt 
utf-8.txt: UTF-8 Unicode text
#这是将utf编码文件转化为gbk
[root@fttsaxf rough_book]# iconv -f utf-8 -t gbk utf-8.txt > gbk.txt
[root@fttsaxf rough_book]# ls
find  gbk.txt  phone  phone.patch  phone_v2  utf-8.txt
[root@fttsaxf rough_book]# file gbk.txt 
gbk.txt: ISO-8859 text

读取这些文件

Python 3.6.8 (default, Nov 16 2020, 16:55:22) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> fp = open("utf-8.txt")
>>> fp.read()
'这是utf-8\n'
>>> fp2 = open("gbk.txt")
>>> fp2.read()  # 因为使用了pyhon3默认的编码方式,utf
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python3.6/codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd5 in position 0: invalid continuation byte
>>> fp2 = open("gbk.txt",encoding = "gbk")  # 指定编码方式为"gbk"
>>> fp2.read()
'这是gbk.tx\n'

#用python看文件编码方式
>>> fp = open("utf-8.txt","rb")
>>> print(chardet.detect(fp.read()))
{'encoding': 'utf-8', 'confidence': 0.7525, 'language': ''}
>>> fp2 = open("gbk.txt","rb")
>>> print(chardet.detect(fp2.read()))
{'encoding': 'ISO-8859-5', 'confidence': 0.4388398420352105, 'language': 'Russian'}

2.4、打开文件

文件打开类型,是文本类型,还是二进制类型。

>>> fp = open("utf-8.txt","w")
>>> fp.write("YOU ARE SB!\n")
12  # 这里的是字符
>>> fp.write("你好\n")
3

2.4.1、with管理语句

with语句体里的内容执行完毕,会自动关闭fp的连接

?

import random
from collections import Counter
with open("test.txt","a+") as fp:
    fp.truncate(0)  # 清空文本的内容
    i = 0
    while i < 100:
        i += 1
        lucky = random.randint(1,255)
        fp.write(f"172.25.254.{lucky}\n")
    fp.seek(0)
    biglst = fp.readlines()
    counter = Counter(biglst)
    most_arr = sorted(counter.items(), key=lambda pair: (-pair[1], pair[0]))
    print(most_arr[0:10])

2.5、读取文件?

2.5.1、关于读的时候,光标的问题

[root@fttsaxf rough_book]# cat test1.txt # 编码方式为ASCII
abc
abcfdsd
abcfdsagasdd
# 所有的读只会从光标的位置往后才开始读。读过之后的光标是在末尾了,若是再次使用读,就读不到东西了
>>> fp3 = open("test1.txt","r")
>>> fp3.read()
'abc\nabcfdsd\nabcfdsagasdd\n'
>>> fp3.read()
''

#read读的是字节数,如果没有固定读多少个字节,会自动读到最后
>>> fp = open("test2.txt")  # 这个编码方式为utf-8
>>> fp.read(8)
'fajagaig'
>>> fp.read(2)
'ow'
>>> fp.read(3)
'g\n中'
>>> fp.read(3)
'文字符'

2.5.2、移动光标

# 使用0时
>>> fp.read()
''
>>> fp.seek(0)  # 这个是字节位置
0
>>> fp.read()
'fajagaigowg\n'

# 使用1和2的时
# 移动光标位置 cookie=> 偏移量 whence=> 相对位置 (0-> 开始, 1->当前, 2->末尾)

>>> fp = open("test2.txt","rb")
>>> fp.seek(-2,2)
17
>>> fp.read()
b'\xa6\n'
>>> fp.seek(-13,2)
6
>>> fp.read()
b'\xe4\xb8\xad\xe6\x96\x87\xe5\xad\x97\xe7\xac\xa6\n'
>>> fp.seek(-13,2)
6
>>> fp.read().decode("utf8")
'中文字符\n'  # 这个为13个字节

2.5.3、readline()

#readline()  每一次都读一行
>>> fp.seek(0)
0
>>> fp.readline()
'fajagaigowg\n'
>>> fp.readline()
'中文字符\n'


>>> fp.seek(0)
0
>>> fp.read(3)
'faj'
>>> fp.readline()
'agaigowg\n'

2.5.4、readlines()

?大文件推荐使用readlines(n)来读取,如果用read()可能会造成一个单词缺失一半

#readlines()全部读完,每一行作为一个元素,存入列表里边去
>>> fp.seek(0)
0
>>> fp.readlines()
['fajagaigowg\n', '中文字符\n']

#3若是加入参数,光标所在字节在哪一行,把那一行的字节全部读出来
>>> fp.readlines(6)
['fajag\n', '中文字符\n']
>>> fp.seek(0)
0
>>> fp.readlines(5)
['fajag\n']
>>> fp.seek(0)
0
>>> fp.readlines(7)
['fajag\n', '中文字符\n']

2.5.5、 读取文件命令总结

# fp.read()  从光标位置读到文件末尾
# fp.readline()  从光标位置读到行末
# fp.readlines()   从光标位置读到文件末尾,每一行作为一个元素放到列表里返回
# fp.seek()  移动光标的位置

2.6、写操作

f.write('hello')

2.6.1、为什么不实时写入磁盘

硬盘是 慢设备 ,频率读写会增大磁盘压力, 产生瓶颈

2.6.2、什么时候会写入磁盘

1、缓存区满的时候;2、进程关闭;3、强制刷新(f.fush());4、文件关闭(f.close())

# 注意 这里是在两个bash进程之间切换使用
>>> fp = open("utf-8.txt","w")
>>> fp.write("YOU ARE SB!\n")
12
>>> fp.write("你好\n")
3

# 然后我们在这边并不能够打开

[root@fttsaxf rough_book]# cat utf-8.txt 
[root@fttsaxf rough_book]# 

# 因为写入后,这些数据还在缓存里边。程序退出的时候,缓存的数据会放入进磁盘里;或者说缓存区满了,也会自动放进磁盘。

>>> fp.flush()  # 强制刷新到磁盘上

[root@fttsaxf rough_book]# cat utf-8.txt 
YOU ARE SB!
你好


# 有读缓存也有写缓存

redis是缓存。没有什么是加入中间层是解决不了的???,而这个redis就是这个中间层。

?

?

?

>>> fp = open("test3.txt","ab",buffering=0)
>>> fp.write(b'a')
1
#output:
"""
[root@fttsaxf rough_book]# cat test3.txt 
#sf
gaj
#jhhh
ghhhhh
"""
>>> fp.write(b'\n')  # 要使用"\n"换行符之后,才会写入到磁盘中
1
#output
"""
[root@fttsaxf rough_book]# cat test3.txt 
#sf
gaj
#jhhh
ghhhhh
a
"""
>>> fp.write(b'xxxx')
4
>>> fp.write(b'pppppp\n')
7

2.7、文件对象其他方法

?

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:24:55  更:2022-03-08 22:26:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/31 4:31:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码