0
点赞
收藏
分享

微信扫一扫

文件------概念、基本操作、打开文件的方式、按行读取文件内容、复制文件、文件/目录的常用管理操作、文本文件的编码格式、练习1-4

清冷的蓝天天 2022-04-23 阅读 62
python

文件的概念

文件的概念

计算机的文件,就是存储在某种长期储存设备上的一段数据

长期存储设备包括:硬盘、U盘、移动硬盘、光盘。。。

文件的作用

将数据长期保存下来,在需要的时候使用

文件的存储方式

在计算机中,文件是以二进制的方式保存在磁盘上的

文本文件和二进制文件

文本文件

可以使用文本编辑软件查看

本质上还是二进制文件

例如:python的源程序

二进制文件

保存的内容不是给人直接阅读的,而是提供给其他软件使用的

例如:图片文件、音频文件、视频文件等

二进制文件不能使用文本编辑软件查看

文件的基本操作

操作文件的套路

在计算机中要操作文件的套路非常固定,一共包含三个步骤:

1打开文件-→将硬盘中的数据调到内存

2读、写文件→都在内存中进行,写文件最终会将内存中的数据,写入到硬盘

将文件内容读入内存

将内存内容写入文件---à存到硬盘

3.关闭文件------将内存中的数据清楚

操作文件的函数/方法

在python中要操作文件,需要记住一个函数和三个方法

open函数负责打开文件,并且返回文件对象

read/write/close三个方法都需要通过文件对象来调用

read方法--读取文件

open函数的第一个参数是要打开的文件名(文件名区分大小写)

如果文件存在,返回文件操作对象

如果文件不存在,抛出异常

read方法可以一次性读入并返回文件的所有内容

close方法负责关闭文件

如果忘记关闭文件,会造成系统资源消耗,并且会影响到后续对文件的访问

注意:方法执行后,会把文件指针移动到文件的末尾

# 1.打开文件
file = open("README",encoding='UTF-8')  # 文件名区分大小写
# 2.读取文件内容 
text = file.read()
print(text)
# 3.关闭文件
file.close()

提示:在开发中,通常会先编写打开和关闭的代码,再编写中间针对文件的读/写操作!

recv = open("README","r",encoding='utf-8')  #返回一个对象,也是一个句柄

"""

打开README文件,用只读的形式打开,文本编码是UTF-8

"""

#对句柄进行操作

print(recv.read())

#完成操作之后,要关闭文件句柄,从内存中将句柄删除

recv.close()

 

with open("README","r",encoding='utf-8') as recv:
    print(recv.read())
    #代码执行完默认,调用关闭的方法#recv.close() 不用写了

with open("README", "r", encoding='utf-8') as recv:

    print(recv.read())
    print("*" * 50)
    print(recv.read())  #
第二次read,没有读到数据

文件指针

文件指针标记从哪个位置开始读取数据

第一次打开文件时,通常文件指针会指向文件的开始位置当执行了read方法后,文件指针会移动到读取内容的末尾

默认情况下会移动到文件末尾

打开文件的方式

open函数默认以只读方式打开文件,并且返回文件对象语法如下:

提示:频整的移动文件指针,会影响文件的读写效率,开发中更多的时候会以只读,只写的方式来操作文件

W 会报错,会将文件覆盖掉

 

 a    会报错,指针会放到最后 文件没有被覆盖掉

 

 r+ 读写 写的操作,不覆盖源文本 指针在文件开头

 

w+ 读写  最开始操作的时候,回将文件覆盖,然后才能进行读或写的操作
        如果再
'w+'模式下,进行read()操作,则返回字符串的长度

 

 

 

 a+ 读写,指针放在文件末尾 执行write()操作,会在文本末尾继续写,读取不到内容

 

 

按行读取文件内容

read方法默认会把文件的所有内容一次性读取到内存

如果文件太大,对内存的占用会非常严重

readline方法

readline方法可以一次读取一行内容

方法执行后,会把文件指针移动到下一行,准备再次读取

#如果文件太大,在读取文件的时候,如果把内容全部读取,会占用比较大的内存空间
#可以采用一行一行读取的形式
with open("README","r",encoding='utf-8') as recv:
    while True:
        print(recv.readline().strip("\n")) #.strip()方法,会将读取到的文本末端的\n \t 空格等去掉
        if not recv.readline():
            break

文件读写案例 —— 复制文件

目标

用代码的方式,来实现文件复制过程

小文件复制

打开一个已有文件,读取完整内容,并写入到另一个文件

# 复制文件的本质是先读取一个文件,然后将内容写入第二个文件
# 有几个open? 首先open第一个文件,都内容,再打开第二个文件,再写内容,最后关闭两个文件
# 方法一:
recv = open("README","r",encoding='utf-8')
content = recv.read()
print(content)

recv2 = open("README_副本","w",encoding='utf-8')
recv2.write(content)
recv2.close()

recv.close()

 

#方法二:
with open("README","r",encoding='utf-8') as recv:
    content = recv.read()

    with open("README_副本","w",encoding='utf-8') as recv2:
        recv2.write(content)

 

 

大文件复制

打开一个已有文件,逐行读取内容,并顺序写入到另一个文件

with open("README","r",encoding='utf-8') as recv:
    with open("README_copy","w",encoding='utf-8') as recv2:
        while True:
            content = recv.readline()
            if not content:
                break
            recv2.write(content)

 

readlines

with open("README","r",encoding='utf-8') as recv:
    #readlines 方法,读取全部内容,在读取过程中,将每一行作为一个元素,村粗到列表中
    content = recv.readlines()
    print(content)
    """
    结果如下:
    关关雎鸠,在河之洲。窈窕淑女,君子好逑。
    参差荇菜,左右流之。窈窕淑女,寤寐求之。
    求之不得,寤寐思服。悠哉悠哉,辗转反侧。
    参差荇菜,左右采之。窈窕淑女,琴瑟友之。
    参差荇菜,左右芼之。窈窕淑女,钟鼓乐之。
    """
    with open("README_copy", "w", encoding='utf-8') as recv2:
        for item in content:
            recv2.write(item)

 

 

文件/目录的常用管理操作

在 终端/文件浏览器 中可以执行常规的 文件/目录 管理操作,例如:

创建、重命名、删除、改变路径、查看目录内容……

在 Python 中,如果希望通过程序实现上述功能,需要导入 os 模块

文件操作

rename 名字会被更改,但是内容不变

 os.rename('README_copy', 'README_copy_reanme')

 

remove 文件被删掉     os.remove('README_copy_reanme')

目录操作

import os
# getcwd
print(os.getcwd()) 

# 获取当前文件所在的绝对路径, 返回路径名 == G:\yanlian0422\文件操作

import os
#listdir  # 列举 目录中的文件或目录
print(os.listdir(r'G:\yanlian0422\文件操作'))

import  os
# mkdir
os.mkdir('dir1')
 # 相对路径
os.mkdir(r'G:\yanlian0422\文件操作\dir2')  # 绝对路径

 

import os

path_1 = "tmp"

#
查看当前工作目录
retval = os.getcwd()
print("
当前工作目录为 %s" % retval)

# os.chdir修改当前工作目录
os.chdir(path_1)

#
查看修改后的工作目录
retval = os.getcwd()
print("
目录修改成功 %s" % retval)

#path.isdir判断是否是文件
print(os.path.isdir(retval))

 

文本文件的编码格式

文本文件存储的内容是基于 字符编码 的文件,常见的编码有 ASCII 编码,UNICODE 编码等

Python 2.x 默认使用 ASCII 编码

Python 3.x 默认使用UTF-8 编码

ASCII 编码和 UNICODE编码

ASCII 编码

计算机中只有 256 个 ASCII 字节

一个 ASCII 在内存中占用 1个字节 的空间

8个 0/1 的排列组合方式一共有 256 种,也就是 2**8 种

 

UTF-8 编码格式

计算机中使用1-6个字节 来表示 一个 utf-8 字符,涵盖了 地球上几乎所有地区的文字

大多数汉字会使用 3个字节 表示

UTF-8 是 Unicode 编码的一种编码格式

Python 2.x 中如何使用中文

在 Python 2.x 文件的第一行 增加以下代码,解释器 会以 utf-8 编码来处理 python 文件

# *-* coding:utf-8 *-*

也可以使用

# coding=utf-8

Unicode 字符串

在 Python 2.x 中,即使指定了文件使用 UTF-8 的编码格式,但是在遍历字符串时,依然会 以字节为单位遍历 字符串

要能够 正确的遍历字符串,在定义字符串时,需要 在字符串的引号前,增加要给 小写字母 u,告诉解释器这是一个 Unicode 字符串(使用 utf-8 编码格式的字符串)

练习1

"""
需求:给诗加上行号
思路:读取诗的每一行,在每一行前面
+行号,将心得文件储存下来
不要在源文件上改
----保留好文件

"""
#读取诗
with open('pome.txt','r',encoding='utf-8') as file_obj:
           contents = file_obj.readlines()
        for i in contents:
            print(i)

 

 

#读取诗
with open('pome.txt','r',encoding='utf-8') as file_obj:
    contents = file_obj.readlines()
    with open('new_pome.txt', 'a', encoding='utf-8') as new_file:
        for i in range(len(contents)):
            new_file.write(str(i+1)+'.'+contents[i])

 

 

练习2

"""
根据链接 ,下载图片

python 模拟 浏览器 通过链接, 从 web 服务器 下载内容
"""
"""
https://w.wallhaven.cc/full/l3/wallhaven-l3p9er.png
"""
import requests

#
写一个 get的 请求报文

url = "https://w.wallhaven.cc/full/o3/wallhaven-o3gqm5.jpg"
headers = {
    "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"}
    # http://www.useragentstring.com/


res = requests.get(url, headers)
print(res)  # <Response [200]>

 

print(res.content)  # res.content 就是 获取到的内容  二进制内容

# 将获取到的内容写入硬盘
with open("pic/2.png", mode='wb') as file_obj:
    file_obj.write(res.content)

 

 

练习3

"""
筛选内容
筛选当前价 大于
20的所有股票数据
"""

with open('files/stock.csv', 'r', encoding='utf-8') as file:
    file.readline()  #
让指针到达第二行

   
for line in file:
        print(line.splitlines())  #
file (从源文件的 第二行开始,)的每一行,都生成一个列表

 

with open('files/stock.csv', 'r', encoding='utf-8') as file:
    file.readline()  #
让指针到达第二行

   
for line in file:
 
        price = float(line.split(',')[2])

        #
如果价格 大于 20,把他们筛选出来

       
if price > 20:
            print(line)

练习4

import requests
import os
with open('files/mv1.csv', 'r', encoding='utf-8') as file_object:
    file_object.readline() #
读取第一行,让指针从第二行开始
   
for line in file_object:
        print(line)
        print(line.split(",")) #
取列表
       
print(line.split(',')[1]) #切片

 

 

import requests
import os
headers = {
    "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"}
with open('files/mv1.csv', 'r', encoding='utf-8') as file_object:
    file_object.readline() #
读取第一行,让指针从第二行开始
   
for line in file_object:
        user_id = line.split(",")[0]
        url = line.split(",")[1].strip()
        print(url)

        res = requests.get(url, headers)
        print(res)
        #
判断文件夹是否存在,如果不存在创建一个心的文件夹
       
if not os.path.exists('download'):
            os.mkdir('download')
        with open('download/{}.jpg'.format(user_id),mode='wb')as png_object:
            png_object.write(res.content)

举报

相关推荐

0 条评论