Python文件操作01(自动化测试文件相关操作)

Python基础语法文章导航:
 

  1. Python基础(01初识数据类型&变量)
  2. Python基础(02条件&循环语句)
  3. Python基础(03字符串格式化&运算符&进制&编码)
  4. Python基础(04 基础练习题)
  5. Python数据类型(day05整型&布尔类型&字符串类型)
  6. Python数据类型(06列表&元组)
  7. Python数据类型(07集合&字典&浮点型&None)

目录

一.文件操作

1.读文件

(1)读文本文件

(2)读图片等非文本内容文件

(3)判断路径是否存在

(4)绝对路径问题

2.写文件

(1)写文本文件      

(2)写图片等非文本文件

3.文件打开模式

4.常见功能

(1)read()

(2)read(n)

(3)readline()

(4)readlines()

(5)write()

(6)flush()

(7)seek()

(8)tell()

5.上下文管理

二.csv格式文件

三.ini格式文件

总结:


一.文件操作

1.读文件

(1)读文本文件

        读文本内容可以采取2中方式:rb和rt。

# 1.打开文件
#	- 路径:
#		相对路径:'info.txt'
#		绝对路径:'C:\Users\W\Desktop\mashibing\project\ceshi_untils\info.txt'
# 	- 模式
# 		rb,表示读取文件原始的二进制(r, 读 read;b, 二进制 binary;)
# 1.打开文件
file_object = open('info.txt', mode='rb')
# 2.读取文件内容,并赋值给data
data = file_object.read()
# 3.关闭文件
file_object.close()

print(data) # b'alex-123\n\xe6\xad\xa6\xe6\xb2\x9b\xe9\xbd\x90-123'
text = data.decode("utf-8")  #小彭在努力学习ing
print(text)
file_object=open('info.txt',mode='rt',encoding='utf-8')
data=file_object.read()
file_object.close()
print(data)

(2)读图片等非文本内容文件

        读图片可以采取rb方式,读出来的结果是二进制的形式。

file_object = open('a1.png', mode='rb')
data = file_object.read()
file_object.close()

print(data) # \x91\xf6\xf2\x83\x8aQFfv\x8b7\xcc\xed\xc3}\x7fT\x9d{.3.\xf1{\xe8\...

(3)判断路径是否存在

        读文件时,文件不存在会报错,所以在读文件之前需要对文件是否真实存在进行判断。

# 判断路径是否存在?
import os

file_path = "/Users/wupeiqi/PycharmProjects/luffyCourse/day09/info.txt"
exists = os.path.exists(file_path)
if exists:
    # 1.打开文件
    file_object = open('infower.txt', mode='rt', encoding='utf-8')
    # 2.读取文件内容,并赋值给data
    data = file_object.read()
    # 3.关闭文件
    file_object.close()
    print(data)
else:
    print("文件不存在")

(4)绝对路径问题

# MAC系统绝对路径书写形式
#1.打开文件
file_object = open('/Users/wupeiqi/PycharmProjects/luffyCourse/day09/info.txt', mode='rt', encoding='utf-8')
# 2.读取文件内容,并赋值给data
data = file_object.read()
# 3.关闭文件
file_object.close()


#windows系统中写绝对路径容易出问题:
# 方法一 :file_object = open('C:\\new\\info.txt', mode='rt', encoding='utf-8')
#方法二
file_object = open(r'C:\new\info.txt', mode='rt', encoding='utf-8')
data = file_object.read()
file_object.close()
print(data)

2.写文件

        注意:文件不存在时,w模式会新建然后再写入内容;文件存在时,w模式会清空文件再写入内容。这一点是与读文件发现文件不存在抛出异常的逻辑是不一样的。

(1)写文本文件      

         写文本内容可以采取2中方式:rb和rt。

file_object = open('C:\\Users\\W\\Desktop\\mashibing\\project\\ceshi_untils\\info.txt', mode='wb')
content=file_object.write("吴佩琦".encode('utf-8'))
file_object.close()
print(content)
file_object = open("info.txt", mode='wt', encoding='utf-8')
file_object.write("xiao萍")
file_object.close()

(2)写图片等非文本文件

        写图片可以采取的步骤:先用rb模式读出原图片的二进制形式,然后再用wb把读的二进制写到新的图片里面去,实现图片的copy。

f1 = open('a1.png',mode='rb')
content = f1.read()
f1.close()

f2 = open('a2.png',mode='wb')
f2.write(content)
f2.close()

3.文件打开模式

关于文件的打开模式常见应用有:

  • 只读:rrtrb (用)

    • 存在,读

    • 不存在,报错

  • 只写:wwtwb(用)

    • 存在,清空再写

    • 不存在,创建再写

  • 只写:xxtxb

    • 存在,报错

    • 不存在,创建再写。

  • 只写:aatab【尾部追加】(用)

    • 存在,尾部追加。

    • 不存在,创建再写。

  • 读写

    • r+、rt+、rb+,默认光标位置:起始位置

    • #1.先读后写,从位置0开始读,读完从读完的末尾的位置开始写进去数字
      file_object = open('info.txt', mode='rt+')
      # 读取内容
      data = file_object.read()
      print(data)   #123
      # 写入内容
      file_object.write("你好呀")  #123你好呀
      file_object.close()
      
      #2.先写后读,从位置0开始写覆盖之前的字符串,写完从写完的末尾的位置开始读数字
      file_object = open('info.txt', mode='rt+')   #1234567
      # 写入内容
      file_object.write("alex")   #alex567
      # 读取内容
      data = file_object.read()
      print(data)   #alex567
      file_object.close()
    • w+、wt+、wb+,默认光标位置:起始位置(清空文件)

    • # 注意:文件不存在时,w模式会新建然后再写入内容;文件存在时,w模式会清空文件再写入内容。
      file_object = open('info.txt', mode='wt+')
      # 读取内容
      data = file_object.read()
      print(data)   #打印输出为空,因为数据已被清空
      # 写入内容
      file_object.write("你好呀")
      # 将光标位置重置起始
      file_object.seek(0)
      # 读取内容
      data = file_object.read()
      print(data)   #你好呀
      file_object.close()
    • x+、xt+、xb+,默认光标位置:起始位置(新文件)

    • a+、at+、ab+,默认光标位置:末尾

      file_object = open('info.txt', mode='at+')  #你好呀
      # 写入内容
      file_object.write("武沛齐")
      # 将光标位置重置起始
      file_object.seek(0)
      # 读取内容
      data = file_object.read()
      print(data)                  #你好呀武沛齐
      file_object.close()

4.常见功能

(1)read()

        read():读所有

f = open('info.txt', mode='r',encoding='utf-8')
data = f.read()
f.close()

(2)read(n)

       read(n): 读n个字符(字节)

f = open('info.txt', mode='r',encoding='utf-8')   #123
# 读1个字符
chunk1 = f.read(1)  #1
chunk2 = f.read(2)  #23
print(chunk1,chunk2)
f.close()

(3)readline()

#每次读一行
#123
#456
f = open('info.txt', mode='r', encoding='utf-8')
v1 = f.readline()
print(v1)    #123
v2 = f.readline()
print(v2)    #456
f.close()

(4)readlines()

        读所有行,每行作为列表的一个元素。

f = open('info.txt', mode='rb')
data_list = f.readlines()
f.close()
print(data_list)
 #[b'\xc4\xe3\xba\xc3\xd1\xbd\xce\xe4\xc5\xe6\xc6\xeb\r\n', b'123\r\n', b'3333\r\n', b'456\r\n', b'789']

        for循环,读出每行的数据,并输出。

f = open('info.txt', mode='r', encoding='utf-8')
for line in f:
    print(line.strip())
f.close()

(5)write()

(6)flush()

f = open('info.txt', mode='a',encoding='utf-8')
while True:
    # 不是写到了硬盘,而是写在缓冲区,系统会将缓冲区的内容刷到硬盘。
	f.write("武沛齐")
    f.flush()
f.close()

(7)seek()

        移动光标位置(字节)。注意:在a模式下,调用write在文件中写入内容时,永远只能将内容写入到尾部,不会写到光标的位置。

f = open('info.txt', mode='r+', encoding='utf-8')
# 移动到指定字节的位置
f.seek(3)
f.write("武沛齐")
f.close()

(8)tell()

        获取当前光标位置。

f = open('info.txt', mode='r', encoding='utf-8')

p1 = f.tell()
print(p1)  # 0

f.read(3)  # 读3个字符 3*3=9字节

p2 = f.tell()
print(p2)  # 9

f.close()
f = open('info.txt', mode='rb')

p1 = f.tell()
print(p1)  # 0

f.read(3)  # 读3个字节

p2 = f.tell()
print(p2)  # 3

f.close()

5.上下文管理

        之前对文件进行操作时,每次都要打开和关闭文件,比较繁琐且容易忘记关闭文件。

        以后再进行文件操作时,推荐使用with上下文管理,它可以自动实现关闭文件。

with open("xxxx.txt", mode='rb') as f1, open("xxxx.txt", mode='rb') as f2:
    data1 = f1.read()
    data2 = f2.read()
    print(data1)
    print(data2)

二.csv格式文件

        逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。对于这种格式的数据,我们需要利用open函数来读取文件并根据逗号分隔的特点来进行处理。

练习题案例:下载文档中的所有图片且以用户名为图片名称存储。

ID,用户名,头像
26044585,Hush,https://hbimg.huabanimg.com/51d46dc32abe7ac7f83b94c67bb88cacc46869954f478-aP4Q3V
19318369,柒十一,https://hbimg.huabanimg.com/703fdb063bdc37b11033ef794f9b3a7adfa01fd21a6d1-wTFbnO
15529690,Law344,https://hbimg.huabanimg.com/b438d8c61ed2abf50ca94e00f257ca7a223e3b364b471-xrzoQd
18311394,Jennah·,https://hbimg.huabanimg.com/4edba1ed6a71797f52355aa1de5af961b85bf824cb71-px1nZz

import os
import requests

with open('files/mv.csv', mode='r', encoding='utf-8') as file_object:
    file_object.readline()
    for line in file_object:
        user_id, username, url = line.strip().split(',')
        print(username, url)

        # 1.根据URL下载图片
        res = requests.get(
            url=url,
            headers={
                "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
            }
        )

        # 检查images目录是否存在?不存在,则创建images目录
        if not os.path.exists("images"):
            # 创建images目录
            os.makedirs("images")

        # 2.将图片的内容写入到文件
        with open("images/{}.png".format(username), mode='wb') as img_object:
            img_object.write(res.content)

三.ini格式文件

        ini文件是Initialization File的缩写,平时用于存储软件的的配置文件。例如:MySQL数据库的配置文件。

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-bin=py-mysql-bin
character-set-server=utf8
collation-server=utf8_general_ci
log-error=/var/log/mysqld.log
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

[client]
default-character-set=utf8
import configparser

config = configparser.ConfigParser()
config.read('files/my.ini', encoding='utf-8')
# config.read('/Users/wupeiqi/PycharmProjects/luffyCourse/day09/files/my.ini', encoding='utf-8')

# 1.获取所有的节点
result = config.sections()
print(result)  # ['mysqld', 'mysqld_safe', 'client']

# 2.获取节点下的键值
result = config.items("mysqld_safe")
print(result)  # [('log-error', '/var/log/mariadb/mariadb.log'), ('pid-file', '/var/run/mariadb/mariadb.pid')]
for key, value in config.items("mysqld_safe"):
    print(key, value)


# 3.获取某个节点下的键对应的值
result = config.get("mysqld","collation-server")
print(result)


# 4.其他
# 4.1 是否存在节点
v1 = config.has_section("client")
print(v1)

# 4.2 添加一个节点
config.add_section("group")
config.set('group','name','wupeiqi')
config.set('client','name','wupeiqi')
config.write(open('files/new.ini', mode='w', encoding='utf-8'))

# 4.3 # 删除节点
config.remove_section('client')
# 删除节点中的键值
config.remove_option("mysqld", "datadir")

config.write(open('files/new.ini', mode='w', encoding='utf-8'))

总结:

        以上为文件相关的操作的部分内容只需要理解即可,后续开发时会调用文件相关操作就可以。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值