学习python第十七天,文件处理

Posted 不吃 西红柿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习python第十七天,文件处理相关的知识,希望对你有一定的参考价值。

学习python第十七天,文件处理

读取文件

读取文件之前我们都需要将文件放在代码的相同路径里,,方便读取

以下面一个文件示例

import sys

print(sys.getdefaultencoding())
# 这里是判断输出电脑读取文件的默认编码
file = open(file='致橡树.txt', mode='r', encoding='utf-8')
try:
    data = file.read(32)
    print(data, end='')
except:
    print('读文件发生错误')
    pass
finally:
    file.close()

    
    
import sys

print(sys.getdefaultencoding())
file = open(file='致橡树.txt', mode='r', encoding='utf-8')
try:
    data = file.read(32)
    while data:
        print(data, end='')
        data = file.read(32)
except:
    print('读文件发生错误')
    pass
finally:
    file.close()

读取txt文件,直接打开,选择read---->‘r’, 读取的编码选择电脑使用的’utf-8’

这里用try except来捕获读取文件发生异常的情况,如果发生异常不报错但是会从except提醒发生异常

在读取文件完毕之后我们要关闭文件,否则文件将一直处于被操作状态,

finally:

​ file.close()

用于关闭文件,无论代码执行成什么样,finally缩减里的代码都会执行,也就是说无论前面的代码,是否出错,但是文件已经打开,我们就要在最后将其关闭

第二种读法是为了节省内存,我们在读取文件的时候呢会占用系统内存,如果整篇文件一起读就会占用较大的内存,所以选择用循环的方式32个字符32个字符的读取,注意这里并非只能是32也可以是16、32、64、128、256、512.。。。。但要是2的次方。

文件操作

读取二进制文件,字节文件

我们以一张图片为例

这里导入到模块是为了移动文件指针,指针就好比是列表的索引,这两个模块对应着文件的最后一个指针和第一个

其实不用它也可以,(0,2)也是一样的😂,但是还是要用,比较高级

from io import SEEK_END, SEEK_SET

# 'rb'读取二进制文件
file = open(file='beautyful_gril.jpg', mode='rb')
# 如果希望获得文件的字节数,可以先用seek将文件指针移到文件末尾
# file.seek(0, 2)
file.seek(0, SEEK_END)
# 然后通过tell方法获取文件指针移动的字节数,这个字节数就是文件的大小
print(file.tell())
# 将文件指针移到文件最开始的位置
# file.seek(0, 0)
file.seek(0, SEEK_SET)
# print(len(file.read()))
try:
    data = file.read(512)
    while data:
        print(file.tell())
        print(data, end='')
        data = file.read(512)
finally:
    file.close()

知道字节数我们好确定使用的循环的字节段大小,我的这张图片有18万多个字节所以我选用512个字节作为循环

这里没有except也就是如果报错就什么都不输出

写文本文件

写一篇将进酒

# 操作模式-- a -- 创建新文件或将文件指针移动到原有文件的末尾再写入新内容
#file = open('将进酒.txt', mode='a', encoding='utf-8')
with open('小雨康桥.txt', mode='a', encoding='utf-8') as
try:
    file.write('君不见黄河之水天上来,奔流到海不复回\\n')
    file.write('君不见高堂明镜悲白发,朝如青丝暮成雪\\n')
    file.write('人生得意须尽欢,莫使金樽空对月\\n')
    file.write('天生我材必有用,千金散尽还复来\\n')
    pass
finally:
    file.close()

当然也可以一句一句的写,

用with open as 的方法看起来更加高级,增加代码的可读性,目的一样,但是更加优雅

文件复制

我们以函数的方式来实现

还是以那张图片为例

def file_copy(source_file, target_file):
    """复制文件
       第一个参数是目标文件名
       第二个参数是复制下来的文件的文件名
       """
    with open (source_file, 'rb') as source:
        with open(targey_file, 'wb') as target:
            # 'wb',写二进制文件,这里就是创建一个二进制文件将之前的二进制文件写进去
            data = source.read(512)
            while data:
                # 当data为空时就说明文件已经读取完毕,结束循环
                target.write(data)
                # 将读取出来的二进制文件一次写入新的文件
                data = source.read(512)
               
            
if __name__ == '__main__':
    file_copy('beautyful_gril.jpg','C:/Users/86187/Desktop/beautyful_gril.jpg')
    # 我这里是将它存在桌面上,存储时一定要选择存储的位置
                

练习

将一百以内的质数写入文件,每行一个数

def is_prime():
    for i in range(2, num):
        if num % i == 0:
            return False
    return True

def main():
    with open('100以内的质数.txt', mode='a', encoding='utf-8') as file:
        for num in range(2, 100):
            if is_prime(num):
                file.write(f'{num}\\n')
              
if __name__ = '__ main__':
    main()

从上往下以此为

判断质数函数

循环1~100,将循环导入求质数函数如果返回的时True就说明是质数就写入文件

读取csv(逗号分隔值)文件

with open('2018年北京积分落户数据.csv', mode='r', encoding='utf-8') as file:
    content = file.readline()
    while content:
        values = content.replace('\\n', '').split(',')
        print(values)
        content = file.readline()
        
        
        
        
        
import csv
with open('2018年北京积分落户数据.csv', mode='r', encoding='utf-8') as file:
    # delimiter------>设置分隔符,默认英语的逗号
    # quotechar------>包裹字符串的符号
    reader = csv.reader(file, delimiter=',', quotechar='"')
    for row in reader:
        print(row)

第一种读法,是将文件一行一行的读取,然后遍历每一行,遍历行得到一个个的字符串,将转行的字符串,用逗号替代转行字符,就不会转行,使用split将字符串放进列表里

第二种就直接导入模块使用里面的函数替代第一种方法的步骤

练习

写一个文件将10个学生的三门课程成绩写进去,三门课程的成绩用随机数生成

import random
with open('score.csv', 'w', newline='') as file:
    #newline=''的使用是为了避免空行,可以分别运行有它和没它后观察结果
    writer = csv.weiter(file)
    wreiter.writerow('学生姓名', '语文', '数学', '英语')
    for _ in range(10):
        name_student = input('学术姓名: '):
            list1 = []
            for _ in range(3)
            score = random.randrange(50, 100)
            list1.append(score)
       writer.writerow(name_stuudent, list1[0], list[1], list[2])
    


作业2:读取刚才的CSV文件,计算每个学生的平均分,统计每门课的最高分、最低分、标准差



def standard_deviation(nums: list):
    avg = aravge(nums)
    total = 0
    avg_total = 0
    for num in nums:
        avg_total = (avg - num) ** 2
    return (avg_total / len(nums)) ** 0.5


def main():

    with open('score.csv', 'r') as file:
        content1 = file.readline()
        content = file.readline()
        chinese = []
        math = []
        english = []
        while content:

            value = content.replace('\\n', '').split(',')
            name = value[0]
            x, y, z = value = [int(i) for i in value[1:]]
           
            chinese.append(x)

            math.append(y)

            english.append(z)
            avg_score = sum(value) / len(value)
            print(f'{name}平均分为{avg_score:.2f}')
            content = file.readline()

        for i in [chinese, math, english]:
            if i == chinese:
                object = '语文'
            elif i == math:
                object = '数学'
            else:
                object = '英语'
            print(f'{object}最高分最低分分别为{max(i)}{min(i)},标准差为{standard_deviation(i)}')
        # print(f'语文最高最低分分别分为{max(chinese)}和{min(chinese)},'
        #       f'数学最高最低分分别分为{max(math)}和{min(math)},'
        #       f'英语最高最低分分别分为{max(english)}和{min(english)}')
        # print(f'语文标准差为{standard_deviation(chinese)},'
        #       f'数学标准差为{standard_deviation(math)}, '
        #       f'英语标准差为{standard_deviation(english)}')


if __name__ == '__main__':
    main()

以上是关于学习python第十七天,文件处理的主要内容,如果未能解决你的问题,请参考以下文章

《Python编程从入门到实践》——学习python的第十七天

《Python编程从入门到实践》——学习python的第十七天

《Python编程从入门到实践》——学习python的第十七天

《Python编程从入门到实践》——学习python的第十七天

python第十七天---时间模块random模块

python基础学习 第十七天