学习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的第十七天