python文件自动化处理 -- 读写文件

Posted 胜天半月子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python文件自动化处理 -- 读写文件相关的知识,希望对你有一定的参考价值。

文章目录


一、os.makedirs()

  • os.makedirs()

程序可以用os.makedirs()函数创建新文件夹(目录)

1.1 文件读过程

在python中,读写文件有3个步骤:

  1. 调用open0函数,返回一个File对象。
  2. 调用File对象的read0或write0方法。
  3. 调用File对象的close0方法,关闭该文件。⭐
file = open(file='./test.txt',encoding = 'UTF-8')
print(file)

<_io.TextIOWrapper name=’./test.txt’ mode=‘r’ encoding=‘UTF-8’>

  • test.txt

  • read()读文件

content = file.read()
print(content)
file.close()

白日依山尽
黄河入海流
欲穷千里目
更上一层楼

  • readlines()读文件
file = open(file='./test.txt',encoding = 'UTF-8')
contentList = file.readlines()
print(contentList)
file.close()

[‘白日依山尽\\n’, ‘黄河入海流\\n’, ‘欲穷千里目\\n’, ‘更上一层楼’]

1.2 文件写过程

  • 覆盖写:w
  • 追加写:a

案例-生成随机的测验试卷⭐⭐

  • 构思
  • 创建35份不同的测验试卷。
  • 为每份试卷创建50个多重选择题,次序随机。
  • 为每个问题提供一个正确答案和3个随机的错误答案,次序随机。
  • 将测验试卷写到35个文本文件中。
  • 将答案写到35个文本文件中。
  • 代码编写
  • 将州和它们的首府(即省会)保存在一个字典中。 (类似于 省份:省会)
  • 针对测验文本文件和答案文本文件,调用open(),write()和close().
  • 利用random.shuffle()随机调整问题和多重选项的次序。
import random
import os
# 将州与首府保存到同一个字典里
capitals = 'Alabama': 'Montgomery', 'Alaska': 'Juneau', 'Arizona': 'Phoenix',
            'Arkansas': 'Little Rock', 'California': 'Sacramento', 'Colorado':
            'Denver','Connecticut': 'Hartford', 'Delaware': 'Dover', 'Florida':
            'Tallahassee','Georgia': 'Atlanta', 'Hawaii': 'Honolulu', 'Idaho':
            'Boise', 'Illinois': 'Springfield', 'Indiana': 'Indianapolis', 'Iowa':
            'Des Moines', 'Kansas': 'Topeka', 'Kentucky': 'Frankfort', 'Louisiana':
            'Baton Rouge', 'Maine': 'Augusta', 'Maryland': 'Annapolis', 'Massachusetts':
            'Boston', 'Michigan': 'Lansing', 'Minnesota': 'Saint Paul', 'Mississippi':
            'Jackson', 'Missouri': 'Jefferson City', 'Montana': 'Helena', 'Nebraska':
            'Lincoln', 'Nevada': 'Carson City', 'New Hampshire': 'Concord',
            'New Jersey': 'Trenton', 'New Mexico':'Santa Fe', 'New York': 'Albany', 'North Carolina': 'Raleigh',
            'North Dakota': 'Bismarck', 'Ohio': 'Columbus', 'Oklahoma': 'Oklahoma City',
            'Oregon': 'Salem', 'Pennsylvania': 'Harrisburg', 'Rhode Island': 'Providence',
            'South Carolina': 'Columbia', 'South Dakota': 'Pierre', 'Tennessee':
            'Nashville', 'Texas': 'Austin', 'Utah': 'Salt Lake City', 'Vermont':
            'Montpelier', 'Virginia': 'Richmond', 'Washington': 'Olympia', 'West Virginia':
            'Charleston', 'Wisconsin': 'Madison', 'Wyoming': 'Cheyenne'

os.mkdir('./testDir')

for quizNum in range(35):

    # 创建试卷和答案文件
    quizFile = open('./testDir/capticalsquiz%s.txt' % (quizNum + 1), 'w')
    answerKeyFile = open('./testDir/capticalsquiz_answers%s.txt' % (quizNum + 1), 'w')

    # 写试卷的标题和开头
    quizFile.write('Name:\\n\\nDate:\\n\\nClass:\\n\\n')
    quizFile.write(' ' * 20 + 'State Capticals Quiz (From %s)' % (quizNum + 1))
    quizFile.write('\\n\\n')

    # 打乱capital字典中州的顺序
    states = list(capitals.keys())  # 列表存入50个州(省)的名字
    random.shuffle(states)  # 打乱states(省)的顺序

    # 循环states,制造50个问题
    for questionNum in range(50):
        # 生成正确答案
        correctAnswer = capitals[states[questionNum]] # 通过列表找到州即键  通过键找到值
        
        wrongAnswers = list(capitals.values())  # 省会构成列表
        
        del wrongAnswers[wrongAnswers.index(correctAnswer)]  # 删除列表中的正确的省会城市
        
        # random.sample()函数:
        # 第一个参数是你希望选择的列表
        # 第二个参数是你希望选择的值的个数。
        
        # 生成4个答案选项
        wrongAnswers = random.sample(wrongAnswers, 3) # 随机生成3个错误答案
        answerOption = wrongAnswers + [correctAnswer] 
        random.shuffle(answerOption)
        
        
        # 在试卷文件中写入问题
        quizFile.write('%s. What is the capital of %s?\\n' % (questionNum + 1,
                        states[questionNum]))
        for i in range(4):
            quizFile.write(' %s. %s\\n' % ('ABCD'[i], answerOption[i]))
            
        quizFile.write('\\n')

        # 在答案文件中写入答案
        answerKeyFile.write('%s. %s\\n' % (questionNum + 1, 'ABCD'[
            answerOption.index(correctAnswer)]))

    quizFile.close()
    answerKeyFile.close()

案例讲解

  • random.shuffle()函数
import random
alist = [1,2,3,4,5]
random.shuffle(alist)
print(alist)

[2, 1, 3, 5, 4]

  • del关键字
  • del 用于删除对象。在 Python,一切都是对象,因此 del 关键字可用于删除变量、列表或列表片段等
  • 原有的列表变了
x = ["apple", "banana", "cherry"]
del x[0]
print(x) # 在原有的列表更改

[‘banana’, ‘cherry’]

  • random.sample()函数

sample(list, num)返回一个长度为num的新列表,新列表存放list所产生num个随机唯一的元素

capitals = 'Alabama': 'Montgomery', 'Alaska': 'Juneau', 'Arizona': 'Phoenix',
            'Arkansas': 'Little Rock', 'California': 'Sacramento', 'Colorado':
            'Denver','Connecticut': 'Hartford'
            
import random
states = list(capitals.keys()) # 提取字典capitals中的键生成列表states 
print('州:',states)
new_states = random.sample(states,5) #在列表states中随机挑选5个生成新的列表new_states
print('random.sample():',new_states)

州: [‘Alabama’, ‘Alaska’, ‘Arizona’, ‘Arkansas’, ‘California’, ‘Colorado’, ‘Connecticut’]
random.sample(): [‘Colorado’, ‘Alabama’, ‘Arizona’, ‘Arkansas’, ‘Connecticut’]


二、os.walk()

遍历目录树:os.walk()函数被传入一个字符串值,即一个文件夹的路径

返回值3个:

  • 当前文件夹名称的字符串
  • 当前文件夹中子文件夹的字符串的列表
  • 当前文件夹中文件的字符串的列表
import  os
for foldername,subfolders,filenames in os.walk("F:/python/python_automation"):
    print('当前文件夹是:',foldername)
    print('当前文件夹的子文件夹是:',subfolders)
    print('当前文件夹的子文件是:',filenames)

# 注意看函数的返回值(黑体加粗)

当前文件夹是: F:/python/python_automation
当前文件夹的子文件夹是: [’.ipynb_checkpoints’, ‘boob’, ‘newDir’, ‘testDir’]
当前文件夹的子文件是: [‘meitu.jpg’, ‘python面向对象编程_类的使用.ipynb’, ‘test.txt’, ‘文件自动化处理-读写文件.ipynb’]
当前文件夹是: F:/python/python_automation.ipynb_checkpoints
当前文件夹的子文件夹是: []
当前文件夹的子文件是: [‘python面向对象编程_类的使用-checkpoint.ipynb’, ‘文件自动化处理-读写文件-checkpoint.ipynb’]
当前文件夹是: F:/python/python_automation\\boob
当前文件夹的子文件夹是: [‘joy’]
当前文件夹的子文件是: [‘meitu.jpg’, ‘Q_A.zip’]

import  os
for foldername,subfolders,filenames in os.walk("F:/python/python_automation"):
    print('当前文件夹是:',foldername)
    for subfolder in subfolders:
        print('当前文件夹的子文件夹是:',subfolder)
    for file in filenames:
        print('当前文件夹的子文件是:',file)
    print('——'*16)

当前文件夹是: F:/python/python_automation
当前文件夹的子文件夹是: .ipynb_checkpoints
当前文件夹的子文件夹是: boob
当前文件夹的子文件夹是: newDir
当前文件夹的子文件是: meitu.jpg
当前文件夹的子文件是: python面向对象编程_类的使用.ipynb
当前文件夹的子文件是: test.txt
当前文件夹的子文件是: 文件自动化处理-读写文件.ipynb
————————————————————————————————
当前文件夹是: F:/python/python_automation.ipynb_checkpoints
当前文件夹的子文件是: python面向对象编程_类的使用-checkpoint.ipynb
当前文件夹的子文件是: 文件自动化处理-读写文件-checkpoint.ipynb
————————————————————————————————
当前文件夹是: F:/python/python_automation\\boob
当前文件夹的子文件夹是: joy
当前文件夹的子文件是: meitu.jpg
当前文件夹的子文件是: Q_A.zip
————————————————————————————————
当前文件夹是: F:/python/python_automation\\boob\\joy
当前文件夹的子文件夹是: tom
当前文件夹的子文件是: meitu.jpg
————————————————————————————————
当前文件夹是: F:/python/python_automation\\boob\\joy\\tom
当前文件夹的子文件是: meitu.jpg
————————————————————————————————
当前文件夹是: F:/python/python_automation\\newDir
当前文件夹的子文件是: meitu.jpg
————————————————————————————————

案例-快速定位文件位置

findFileName = input('enter the file name you want find:')
targetDir = input('enter a range:')

for foldername,subfolders,filenames in os.walk(targetDir):
    for subfolder in subfolders:
        if subfolder == findFileName:
            print('subfolder:',foldername+'/'+subfolder)
    for filename in filenames:
        if filename == findFileName:
            print('filename:',foldername+'/'+filename)
    print('——'*10)

enter the file name you want find:meitu.jpg
enter a range:F:\\python\\python_automation
filename: F:\\python\\python_automation/meitu.jpg
————————————————————
————————————————————
filename: F:\\python\\python_automation\\boob/meitu.jpg
————————————————————
filename: F:\\python\\python_automation\\boob\\joy/meitu.jpg
————————————————————
filename: F:\\python\\python_automation\\boob\\joy\\tom/meitu.jpg
————————————————————
filename: F:\\python\\python_automation\\newDir/meitu.jpg
————————————————————
————————————————————


三、zipfile模块解压缩文件

  • example.zip

3.1 读取ZIP文件

要读取ZIP文件的内容,首先必须创建一个ZipFile对象(请注意大写首字母Z和F),ZipFile对象在概念上与File对象相似

请注意,zipfile是Python模块的名称ZipFile()是函数的名称

  • ZipFile对象的创建
  • 要创建一个ZipFile对象,就调用zipfie.zipFileo函数,向它传入一个字符串,表示.zip文件的文件名

  • namelist()方法
  • 返回ZIP文件中包含的所有文件和文件夹的字符串的列表

  • getinfo()方法
  • namelist()返回的这些字符串可以传递给ZipFile对象的getinfo()方法,返回一个关于特定文件的ZipInfo对象


3.2 解压缩ZIP文件

  • 步骤
  1. 创建一个ZipFile对象
  2. 调用加压缩的相关函数
  3. 最后使用close()方法关闭ZipFile对象【ZipFile.close()
  • extractall()方法
  • ZipFile对象的extractall()方法从ZIP文件中解压缩所有文件和文件夹,放到当前工作目录中。【最后记得关闭文件
    • 你可以向extractall()传递的一个文件夹名称,它将文件解压缩到那个文件夹,而不是当前工作目录

  • extract()方法
  • ZipFile对象的extract()方法从ZIP文件中解压缩单个文件
  • 传递给extract()的字符串,必须匹配namelist()返回的字符串列表中的一个。或者,你可以向extract()传递第二个参数,将文件解压缩到指定的文件夹,而不是当前工作目录。如果第二个参数指定的文件夹不存在,Python就会创建它。

3.3 压缩ZIP文件

要创建你自己的压缩ZIP文件,必须以“写模式"打开ZipFile对象,即传入w,作为第二个参数(这类似于向open0函数传入w,以写模式打开一个文本文件)。
如果向ZipFile对象的write()方法传入一个路径,Python就会压缩该路径所指的文件,将它加到ZIP文件中。

import zipfile
newZip = zipfile.ZipFile('./Boob/new.zip','w')
newZip.write('./boob') # 将该文件夹压缩到new.zip文件中
newZip.close()
  • 压缩与解压缩
import os
import zipfile
newZip = zipfile.ZipFile('./boob/Q_A.zip','w') # w或者a 尝试看看是哪个
for folderName,subfolders,filenames in os.walk('F:/python/python_automation/testDir/'):
    for filename in filenames:
        filepath = os.path.join(folderName,filename) # 路径拼接作用
        print('filepath:',filepath)
        newZip.write(filepath)
newZip.close()

以上是关于python文件自动化处理 -- 读写文件的主要内容,如果未能解决你的问题,请参考以下文章

python学习day9笔记

Python 中 openpyxl 模块封装,读写 Excel 文件中自动化测试用例数据

python 之更省内存的方式读取文件

python文件读写异常处理

第17天---python办公自动化---读写Excel文件

python文件处理-读写